1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libfuse: lib/fuse.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">libfuse
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',false,false,'search.php','Search');
});
</script>
<div id="main-nav"></div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_97aefd0d527b934f1d99a682da8fe6a9.html">lib</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">fuse.c</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> FUSE: Filesystem in Userspace</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu></span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"></span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> Implementation of the high-level FUSE API on top of the low-level</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> API.</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"></span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> This program can be distributed under the terms of the GNU LGPLv2.</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> See the file COPYING.LIB</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">*/</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">/* For pthread_rwlock_t */</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#define _GNU_SOURCE</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "config.h"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include "fuse_i.h"</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include "<a class="code" href="fuse__lowlevel_8h.html">fuse_lowlevel.h</a>"</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include "<a class="code" href="fuse__opt_8h.html">fuse_opt.h</a>"</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include "fuse_misc.h"</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "fuse_kernel.h"</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#include <stdio.h></span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#include <string.h></span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include <stdlib.h></span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#include <stddef.h></span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include <stdbool.h></span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include <unistd.h></span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include <time.h></span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include <fcntl.h></span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include <limits.h></span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include <errno.h></span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include <signal.h></span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include <dlfcn.h></span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include <assert.h></span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include <poll.h></span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="preprocessor">#include <sys/param.h></span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="preprocessor">#include <sys/uio.h></span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#include <sys/time.h></span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="preprocessor">#include <sys/mman.h></span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="preprocessor">#include <sys/file.h></span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> </div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor">#define FUSE_NODE_SLAB 1</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="preprocessor">#ifndef MAP_ANONYMOUS</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="preprocessor">#undef FUSE_NODE_SLAB</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> </div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="preprocessor">#ifndef RENAME_EXCHANGE</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="preprocessor">#define RENAME_EXCHANGE (1 << 1) </span><span class="comment">/* Exchange source and dest */</span><span class="preprocessor"></span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="preprocessor">#define FUSE_DEFAULT_INTR_SIGNAL SIGUSR1</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="preprocessor">#define FUSE_UNKNOWN_INO 0xffffffff</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="preprocessor">#define OFFSET_MAX 0x7fffffffffffffffLL</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="preprocessor">#define NODE_TABLE_MIN_SIZE 8192</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">struct </span>fuse_fs {</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">struct </span><a class="code" href="structfuse__operations.html">fuse_operations</a> op;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *m;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keywordtype">void</span> *user_data;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keywordtype">int</span> debug;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> };</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="keyword">struct </span>fusemod_so {</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <span class="keywordtype">void</span> *handle;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordtype">int</span> ctr;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> };</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="keyword">struct </span>lock_queue_element {</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keyword">struct </span>lock_queue_element *next;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  pthread_cond_t cond;</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid1;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name1;</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keywordtype">char</span> **path1;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <span class="keyword">struct </span>node **wnode1;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid2;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name2;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordtype">char</span> **path2;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keyword">struct </span>node **wnode2;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordtype">bool</span> first_locked : 1;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordtype">bool</span> second_locked : 1;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordtype">bool</span> done : 1;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> };</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="keyword">struct </span>node_table {</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keyword">struct </span>node **array;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordtype">size_t</span> use;</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordtype">size_t</span> size;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keywordtype">size_t</span> split;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> };</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="preprocessor">#define container_of(ptr, type, member) ({ \</span></div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="preprocessor"> const typeof( ((type *)0)->member ) *__mptr = (ptr); \</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="preprocessor"> (type *)( (char *)__mptr - offsetof(type,member) );})</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="preprocessor">#define list_entry(ptr, type, member) \</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="preprocessor"> container_of(ptr, type, member)</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="keyword">struct </span>list_head {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keyword">struct </span>list_head *next;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="keyword">struct </span>list_head *prev;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> };</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> </div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> <span class="keyword">struct </span>node_slab {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keyword">struct </span>list_head list; <span class="comment">/* must be the first member */</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">struct </span>list_head freelist;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keywordtype">int</span> used;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> };</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="keyword">struct </span>fuse {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keyword">struct </span>fuse_session *se;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keyword">struct </span>node_table name_table;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keyword">struct </span>node_table id_table;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keyword">struct </span>list_head lru_table;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ctr;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> generation;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hidectr;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  pthread_mutex_t lock;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keyword">struct </span><a class="code" href="structfuse__config.html">fuse_config</a> conf;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordtype">int</span> intr_installed;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keyword">struct </span>fuse_fs *fs;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keyword">struct </span>lock_queue_element *lockq;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keywordtype">int</span> pagesize;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keyword">struct </span>list_head partial_slabs;</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keyword">struct </span>list_head full_slabs;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  pthread_t prune_thread;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> };</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> </div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="keyword">struct </span>lock {</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordtype">int</span> type;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  off_t start;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  off_t end;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  pid_t pid;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  uint64_t owner;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keyword">struct </span>lock *next;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> };</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> </div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="keyword">struct </span>node {</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keyword">struct </span>node *name_next;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="keyword">struct </span>node *id_next;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> generation;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keywordtype">int</span> refctr;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keyword">struct </span>node *parent;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="keywordtype">char</span> *name;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  uint64_t nlookup;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="keywordtype">int</span> open_count;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keyword">struct </span>timespec stat_updated;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keyword">struct </span>timespec mtime;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  off_t size;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keyword">struct </span>lock *locks;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> is_hidden : 1;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_valid : 1;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordtype">int</span> treelock;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordtype">char</span> inline_name[32];</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span> };</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> </div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> <span class="preprocessor">#define TREELOCK_WRITE -1</span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <span class="preprocessor">#define TREELOCK_WAIT_OFFSET INT_MIN</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="keyword">struct </span>node_lru {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keyword">struct </span>node node;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keyword">struct </span>list_head lru;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keyword">struct </span>timespec forget_time;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> };</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> </div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="keyword">struct </span>fuse_direntry {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">struct </span>stat stat;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordtype">char</span> *name;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">struct </span>fuse_direntry *next;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> };</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> </div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="keyword">struct </span>fuse_dh {</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  pthread_mutex_t lock;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keyword">struct </span>fuse *fuse;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keywordtype">char</span> *contents;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keyword">struct </span>fuse_direntry *first;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keyword">struct </span>fuse_direntry **last;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordtype">unsigned</span> len;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordtype">unsigned</span> size;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordtype">unsigned</span> needlen;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">int</span> filled;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  uint64_t fh;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keywordtype">int</span> error;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> };</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> </div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <span class="keyword">struct </span>fuse_context_i {</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keyword">struct </span><a class="code" href="structfuse__context.html">fuse_context</a> ctx;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> };</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> </div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment">/* Defined by FUSE_REGISTER_MODULE() in lib/modules/subdir.c and iconv.c. */</span></div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">extern</span> <a class="code" href="fuse_8h.html#ab92480001ec4f475a082cbd32bee94e2">fuse_module_factory_t</a> fuse_module_subdir_factory;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="preprocessor">#ifdef HAVE_ICONV</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="keyword">extern</span> <a class="code" href="fuse_8h.html#ab92480001ec4f475a082cbd32bee94e2">fuse_module_factory_t</a> fuse_module_iconv_factory;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> </div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="keyword">static</span> pthread_key_t fuse_context_key;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> <span class="keyword">static</span> pthread_mutex_t fuse_context_lock = PTHREAD_MUTEX_INITIALIZER;</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_context_ref;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *fuse_modules = NULL;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_register_module(<span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <a class="code" href="fuse_8h.html#ab92480001ec4f475a082cbd32bee94e2">fuse_module_factory_t</a> factory,</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keyword">struct</span> fusemod_so *so)</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *mod;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> </div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  mod = calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structfuse__module.html">fuse_module</a>));</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">if</span> (!mod) {</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  fprintf(stderr, <span class="stringliteral">"fuse: failed to allocate module\n"</span>);</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  mod->name = strdup(name);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordflow">if</span> (!mod->name) {</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  fprintf(stderr, <span class="stringliteral">"fuse: failed to allocate module name\n"</span>);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  free(mod);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  mod->factory = factory;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  mod->ctr = 0;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  mod->so = so;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">if</span> (mod->so)</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  mod->so->ctr++;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  mod->next = fuse_modules;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  fuse_modules = mod;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> </div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> }</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span> </div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_unregister_module(<span class="keyword">struct</span> <a class="code" href="structfuse__module.html">fuse_module</a> *m)</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> **mp;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">for</span> (mp = &fuse_modules; *mp; mp = &(*mp)->next) {</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">if</span> (*mp == m) {</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  *mp = (*mp)->next;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  }</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  }</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  free(m->name);</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  free(m);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_load_so_module(<span class="keyword">const</span> <span class="keywordtype">char</span> *module)</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> {</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordtype">int</span> ret = -1;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordtype">char</span> *tmp;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keyword">struct </span>fusemod_so *so;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <a class="code" href="fuse_8h.html#ab92480001ec4f475a082cbd32bee94e2">fuse_module_factory_t</a> factory;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> </div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  tmp = malloc(strlen(module) + 64);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordflow">if</span> (!tmp) {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  fprintf(stderr, <span class="stringliteral">"fuse: memory allocation failed\n"</span>);</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  sprintf(tmp, <span class="stringliteral">"libfusemod_%s.so"</span>, module);</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  so = calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fusemod_so));</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">if</span> (!so) {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  fprintf(stderr, <span class="stringliteral">"fuse: failed to allocate module so\n"</span>);</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  }</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  so->handle = dlopen(tmp, RTLD_NOW);</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">if</span> (so->handle == NULL) {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  fprintf(stderr, <span class="stringliteral">"fuse: dlopen(%s) failed: %s\n"</span>,</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  tmp, dlerror());</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">goto</span> out_free_so;</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  }</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span> </div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  sprintf(tmp, <span class="stringliteral">"fuse_module_%s_factory"</span>, module);</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  *(<span class="keywordtype">void</span>**)(&factory) = dlsym(so->handle, tmp);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">if</span> (factory == NULL) {</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  fprintf(stderr, <span class="stringliteral">"fuse: symbol <%s> not found in module: %s\n"</span>,</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  tmp, dlerror());</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="keywordflow">goto</span> out_dlclose;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  ret = fuse_register_module(module, factory, so);</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">if</span> (ret)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordflow">goto</span> out_dlclose;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> </div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> out:</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  free(tmp);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> </div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> out_dlclose:</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  dlclose(so->handle);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> out_free_so:</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  free(so);</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *fuse_find_module(<span class="keyword">const</span> <span class="keywordtype">char</span> *module)</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> {</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *m;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">for</span> (m = fuse_modules; m; m = m->next) {</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keywordflow">if</span> (strcmp(module, m->name) == 0) {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  m->ctr++;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  }</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keywordflow">return</span> m;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span> }</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> </div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *fuse_get_module(<span class="keyword">const</span> <span class="keywordtype">char</span> *module)</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> {</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *m;</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> </div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  pthread_mutex_lock(&fuse_context_lock);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  m = fuse_find_module(module);</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">if</span> (!m) {</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordtype">int</span> err = fuse_load_so_module(module);</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  m = fuse_find_module(module);</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  }</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  pthread_mutex_unlock(&fuse_context_lock);</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordflow">return</span> m;</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> }</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> </div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_put_module(<span class="keyword">struct</span> <a class="code" href="structfuse__module.html">fuse_module</a> *m)</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> {</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  pthread_mutex_lock(&fuse_context_lock);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">if</span> (m->so)</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  assert(m->ctr > 0);</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <span class="comment">/* Builtin modules may already have m->ctr == 0 */</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordflow">if</span> (m->ctr > 0)</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  m->ctr--;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">if</span> (!m->ctr && m->so) {</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keyword">struct </span>fusemod_so *so = m->so;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  assert(so->ctr > 0);</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  so->ctr--;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">if</span> (!so->ctr) {</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> **mp;</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">for</span> (mp = &fuse_modules; *mp;) {</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">if</span> ((*mp)->so == so)</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  fuse_unregister_module(*mp);</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  mp = &(*mp)->next;</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  }</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  dlclose(so->handle);</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  free(so);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  }</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!m->ctr) {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  fuse_unregister_module(m);</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  pthread_mutex_unlock(&fuse_context_lock);</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> }</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> </div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="keyword">static</span> <span class="keywordtype">void</span> init_list_head(<span class="keyword">struct</span> list_head *list)</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> {</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  list->next = list;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  list->prev = list;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> <span class="keyword">static</span> <span class="keywordtype">int</span> list_empty(<span class="keyword">const</span> <span class="keyword">struct</span> list_head *head)</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> {</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordflow">return</span> head->next == head;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> }</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> </div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> <span class="keyword">static</span> <span class="keywordtype">void</span> list_add(<span class="keyword">struct</span> list_head *<span class="keyword">new</span>, <span class="keyword">struct</span> list_head *prev,</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keyword">struct</span> list_head *next)</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  next->prev = <span class="keyword">new</span>;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keyword">new</span>->next = next;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="keyword">new</span>->prev = prev;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  prev->next = <span class="keyword">new</span>;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> }</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> </div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> list_add_head(<span class="keyword">struct</span> list_head *<span class="keyword">new</span>, <span class="keyword">struct</span> list_head *head)</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> {</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  list_add(<span class="keyword">new</span>, head, head->next);</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> }</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> </div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> list_add_tail(<span class="keyword">struct</span> list_head *<span class="keyword">new</span>, <span class="keyword">struct</span> list_head *head)</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> {</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  list_add(<span class="keyword">new</span>, head->prev, head);</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> }</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span> </div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> list_del(<span class="keyword">struct</span> list_head *entry)</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> {</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keyword">struct </span>list_head *prev = entry->prev;</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keyword">struct </span>list_head *next = entry->next;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> </div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  next->prev = prev;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  prev->next = next;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> }</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span> </div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> lru_enabled(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordflow">return</span> f->conf.remember > 0;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> }</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span> </div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> <span class="keyword">static</span> <span class="keyword">struct </span>node_lru *node_lru(<span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> {</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keywordflow">return</span> (<span class="keyword">struct</span> node_lru *) node;</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span> }</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> </div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span> <span class="keyword">static</span> <span class="keywordtype">size_t</span> get_node_size(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> {</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keywordflow">if</span> (lru_enabled(f))</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">return</span> <span class="keyword">sizeof</span>(<span class="keyword">struct </span>node_lru);</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">return</span> <span class="keyword">sizeof</span>(<span class="keyword">struct </span>node);</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span> }</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span> </div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span> <span class="preprocessor">#ifdef FUSE_NODE_SLAB</span></div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span> <span class="keyword">static</span> <span class="keyword">struct </span>node_slab *list_to_slab(<span class="keyword">struct</span> list_head *head)</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> {</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="keywordflow">return</span> (<span class="keyword">struct</span> node_slab *) head;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span> }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span> </div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span> <span class="keyword">static</span> <span class="keyword">struct </span>node_slab *node_to_slab(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> {</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">return</span> (<span class="keyword">struct</span> node_slab *) (((uintptr_t) node) & ~((uintptr_t) f->pagesize - 1));</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> }</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span> </div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> <span class="keyword">static</span> <span class="keywordtype">int</span> alloc_slab(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> {</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keywordtype">void</span> *mem;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keyword">struct </span>node_slab *slab;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keywordtype">char</span> *start;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordtype">size_t</span> num;</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordtype">size_t</span> i;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keywordtype">size_t</span> node_size = get_node_size(f);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> </div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  mem = mmap(NULL, f->pagesize, PROT_READ | PROT_WRITE,</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span> </div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="keywordflow">if</span> (mem == MAP_FAILED)</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span> </div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  slab = mem;</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  init_list_head(&slab->freelist);</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  slab->used = 0;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  num = (f->pagesize - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>node_slab)) / node_size;</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span> </div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  start = (<span class="keywordtype">char</span> *) mem + f->pagesize - num * node_size;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  for (i = 0; i < num; i++) {</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keyword">struct </span>list_head *n;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span> </div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  n = (<span class="keyword">struct </span>list_head *) (start + i * node_size);</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  list_add_tail(n, &slab->freelist);</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  }</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  list_add_tail(&slab->list, &f->partial_slabs);</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span> </div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span> }</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span> </div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span> <span class="keyword">static</span> <span class="keyword">struct </span>node *alloc_node(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span> {</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keyword">struct </span>node_slab *slab;</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keyword">struct </span>list_head *node;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> </div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">if</span> (list_empty(&f->partial_slabs)) {</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordtype">int</span> res = alloc_slab(f);</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keywordflow">if</span> (res != 0)</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  }</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  slab = list_to_slab(f->partial_slabs.next);</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  slab->used++;</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  node = slab->freelist.next;</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  list_del(node);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">if</span> (list_empty(&slab->freelist)) {</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  list_del(&slab->list);</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  list_add_tail(&slab->list, &f->full_slabs);</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  }</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  memset(node, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> node));</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span> </div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="keywordflow">return</span> (<span class="keyword">struct</span> node *) node;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span> }</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span> </div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_slab(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node_slab *slab)</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span> {</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> </div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  list_del(&slab->list);</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  res = munmap(slab, f->pagesize);</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordflow">if</span> (res == -1)</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  fprintf(stderr, <span class="stringliteral">"fuse warning: munmap(%p) failed\n"</span>, slab);</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span> }</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span> </div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_node_mem(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span> {</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keyword">struct </span>node_slab *slab = node_to_slab(f, node);</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <span class="keyword">struct </span>list_head *n = (<span class="keyword">struct </span>list_head *) node;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span> </div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  slab->used--;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="keywordflow">if</span> (slab->used) {</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">if</span> (list_empty(&slab->freelist)) {</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  list_del(&slab->list);</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  list_add_tail(&slab->list, &f->partial_slabs);</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  list_add_head(n, &slab->freelist);</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  free_slab(f, slab);</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  }</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span> }</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> <span class="keyword">static</span> <span class="keyword">struct </span>node *alloc_node(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span> {</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keywordflow">return</span> (<span class="keyword">struct</span> node *) calloc(1, get_node_size(f));</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span> }</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span> </div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_node_mem(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span> {</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  (void) f;</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  free(node);</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span> }</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span> </div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span> <span class="keyword">static</span> <span class="keywordtype">size_t</span> id_hash(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino)</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span> {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  uint64_t hash = ((uint32_t) ino * 2654435761U) % f->id_table.size;</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  uint64_t oldhash = hash % (f->id_table.size / 2);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span> </div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">if</span> (oldhash >= f->id_table.split)</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordflow">return</span> oldhash;</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">return</span> hash;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> }</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span> </div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> <span class="keyword">static</span> <span class="keyword">struct </span>node *get_node_nocheck(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid)</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> {</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <span class="keywordtype">size_t</span> hash = id_hash(f, nodeid);</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">for</span> (node = f->id_table.array[hash]; node != NULL; node = node->id_next)</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  <span class="keywordflow">if</span> (node->nodeid == nodeid)</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span> </div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> }</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span> </div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="keyword">static</span> <span class="keyword">struct </span>node *get_node(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid)</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> {</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keyword">struct </span>node *node = get_node_nocheck(f, nodeid);</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">if</span> (!node) {</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  fprintf(stderr, <span class="stringliteral">"fuse internal error: node %llu not found\n"</span>,</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) nodeid);</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  abort();</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  }</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> }</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> </div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> <span class="keyword">static</span> <span class="keywordtype">void</span> curr_time(<span class="keyword">struct</span> timespec *now);</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> <span class="keyword">static</span> <span class="keywordtype">double</span> diff_timespec(<span class="keyword">const</span> <span class="keyword">struct</span> timespec *t1,</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keyword">const</span> <span class="keyword">struct</span> timespec *t2);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> </div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> <span class="keyword">static</span> <span class="keywordtype">void</span> remove_node_lru(<span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> {</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="keyword">struct </span>node_lru *lnode = node_lru(node);</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  list_del(&lnode->lru);</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  init_list_head(&lnode->lru);</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> </div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> <span class="keyword">static</span> <span class="keywordtype">void</span> set_forget_time(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> {</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keyword">struct </span>node_lru *lnode = node_lru(node);</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span> </div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  list_del(&lnode->lru);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  list_add_tail(&lnode->lru, &f->lru_table);</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  curr_time(&lnode->forget_time);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> }</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span> </div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_node(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span> {</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordflow">if</span> (node->name != node->inline_name)</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  free(node->name);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  free_node_mem(f, node);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> }</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> </div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span> <span class="keyword">static</span> <span class="keywordtype">void</span> node_table_reduce(<span class="keyword">struct</span> node_table *t)</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span> {</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordtype">size_t</span> newsize = t->size / 2;</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordtype">void</span> *newarray;</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> </div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">if</span> (newsize < NODE_TABLE_MIN_SIZE)</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> </div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  newarray = realloc(t->array, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> node *) * newsize);</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordflow">if</span> (newarray != NULL)</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  t->array = newarray;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  t->size = newsize;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  t->split = t->size / 2;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span> }</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span> </div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span> <span class="keyword">static</span> <span class="keywordtype">void</span> remerge_id(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span> {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keyword">struct </span>node_table *t = &f->id_table;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="keywordtype">int</span> iter;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span> </div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordflow">if</span> (t->split == 0)</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  node_table_reduce(t);</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> </div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keywordflow">for</span> (iter = 8; t->split > 0 && iter; iter--) {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keyword">struct </span>node **upper;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span> </div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  t->split--;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  upper = &t->array[t->split + t->size / 2];</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordflow">if</span> (*upper) {</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keyword">struct </span>node **nodep;</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">for</span> (nodep = &t->array[t->split]; *nodep;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  nodep = &(*nodep)->id_next);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> </div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  *nodep = *upper;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  *upper = NULL;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  }</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  }</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span> }</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> </div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unhash_id(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keyword">struct </span>node **nodep = &f->id_table.array[id_hash(f, node->nodeid)];</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span> </div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">for</span> (; *nodep != NULL; nodep = &(*nodep)->id_next)</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">if</span> (*nodep == node) {</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  *nodep = node->id_next;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  f->id_table.use--;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> </div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="keywordflow">if</span>(f->id_table.use < f->id_table.size / 4)</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  remerge_id(f);</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  }</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span> }</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span> </div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> <span class="keyword">static</span> <span class="keywordtype">int</span> node_table_resize(<span class="keyword">struct</span> node_table *t)</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span> {</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keywordtype">size_t</span> newsize = t->size * 2;</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordtype">void</span> *newarray;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> </div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  newarray = realloc(t->array, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> node *) * newsize);</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  <span class="keywordflow">if</span> (newarray == NULL)</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> </div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  t->array = newarray;</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  memset(t->array + t->size, 0, t->size * <span class="keyword">sizeof</span>(<span class="keyword">struct</span> node *));</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  t->size = newsize;</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  t->split = 0;</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> </div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span> }</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span> </div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span> <span class="keyword">static</span> <span class="keywordtype">void</span> rehash_id(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span> {</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="keyword">struct </span>node_table *t = &f->id_table;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keyword">struct </span>node **nodep;</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keyword">struct </span>node **next;</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordtype">size_t</span> hash;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span> </div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keywordflow">if</span> (t->split == t->size / 2)</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span> </div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  hash = t->split;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  t->split++;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">for</span> (nodep = &t->array[hash]; *nodep != NULL; nodep = next) {</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keyword">struct </span>node *node = *nodep;</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordtype">size_t</span> newhash = id_hash(f, node->nodeid);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span> </div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordflow">if</span> (newhash != hash) {</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  next = nodep;</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  *nodep = node->id_next;</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  node->id_next = t->array[newhash];</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  t->array[newhash] = node;</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  next = &node->id_next;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  }</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <span class="keywordflow">if</span> (t->split == t->size / 2)</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  node_table_resize(t);</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span> }</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span> </div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span> <span class="keyword">static</span> <span class="keywordtype">void</span> hash_id(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span> {</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordtype">size_t</span> hash = id_hash(f, node->nodeid);</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  node->id_next = f->id_table.array[hash];</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  f->id_table.array[hash] = node;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  f->id_table.use++;</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span> </div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keywordflow">if</span> (f->id_table.use >= f->id_table.size / 2)</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  rehash_id(f);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span> }</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span> </div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span> <span class="keyword">static</span> <span class="keywordtype">size_t</span> name_hash(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span> {</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  uint64_t hash = parent;</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  uint64_t oldhash;</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span> </div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <span class="keywordflow">for</span> (; *name; name++)</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  hash = hash * 31 + (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>) *name;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span> </div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  hash %= f->name_table.size;</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  oldhash = hash % (f->name_table.size / 2);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keywordflow">if</span> (oldhash >= f->name_table.split)</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">return</span> oldhash;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordflow">return</span> hash;</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span> }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span> </div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unref_node(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node);</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span> </div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span> <span class="keyword">static</span> <span class="keywordtype">void</span> remerge_name(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> {</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keyword">struct </span>node_table *t = &f->name_table;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keywordtype">int</span> iter;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span> </div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="keywordflow">if</span> (t->split == 0)</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  node_table_reduce(t);</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span> </div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keywordflow">for</span> (iter = 8; t->split > 0 && iter; iter--) {</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="keyword">struct </span>node **upper;</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span> </div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  t->split--;</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  upper = &t->array[t->split + t->size / 2];</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <span class="keywordflow">if</span> (*upper) {</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keyword">struct </span>node **nodep;</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span> </div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="keywordflow">for</span> (nodep = &t->array[t->split]; *nodep;</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  nodep = &(*nodep)->name_next);</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span> </div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  *nodep = *upper;</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  *upper = NULL;</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  }</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  }</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span> }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> </div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unhash_name(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span> {</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="keywordflow">if</span> (node->name) {</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="keywordtype">size_t</span> hash = name_hash(f, node->parent->nodeid, node->name);</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <span class="keyword">struct </span>node **nodep = &f->name_table.array[hash];</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span> </div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keywordflow">for</span> (; *nodep != NULL; nodep = &(*nodep)->name_next)</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="keywordflow">if</span> (*nodep == node) {</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  *nodep = node->name_next;</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  node->name_next = NULL;</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  unref_node(f, node->parent);</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordflow">if</span> (node->name != node->inline_name)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  free(node->name);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  node->name = NULL;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  node->parent = NULL;</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  f->name_table.use--;</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span> </div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keywordflow">if</span> (f->name_table.use < f->name_table.size / 4)</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  remerge_name(f);</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  }</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  fprintf(stderr,</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="stringliteral">"fuse internal error: unable to unhash node: %llu\n"</span>,</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) node->nodeid);</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  abort();</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  }</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span> }</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span> </div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span> <span class="keyword">static</span> <span class="keywordtype">void</span> rehash_name(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span> {</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <span class="keyword">struct </span>node_table *t = &f->name_table;</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keyword">struct </span>node **nodep;</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keyword">struct </span>node **next;</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordtype">size_t</span> hash;</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span> </div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <span class="keywordflow">if</span> (t->split == t->size / 2)</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span> </div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  hash = t->split;</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  t->split++;</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keywordflow">for</span> (nodep = &t->array[hash]; *nodep != NULL; nodep = next) {</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keyword">struct </span>node *node = *nodep;</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="keywordtype">size_t</span> newhash = name_hash(f, node->parent->nodeid, node->name);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span> </div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  <span class="keywordflow">if</span> (newhash != hash) {</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  next = nodep;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  *nodep = node->name_next;</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  node->name_next = t->array[newhash];</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  t->array[newhash] = node;</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  next = &node->name_next;</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  }</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  }</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  <span class="keywordflow">if</span> (t->split == t->size / 2)</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  node_table_resize(t);</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span> }</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> </div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span> <span class="keyword">static</span> <span class="keywordtype">int</span> hash_name(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parentid,</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span> {</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <span class="keywordtype">size_t</span> hash = name_hash(f, parentid, name);</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="keyword">struct </span>node *parent = get_node(f, parentid);</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="keywordflow">if</span> (strlen(name) < <span class="keyword">sizeof</span>(node->inline_name)) {</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  strcpy(node->inline_name, name);</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  node->name = node->inline_name;</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  node->name = strdup(name);</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  <span class="keywordflow">if</span> (node->name == NULL)</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  }</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> </div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  parent->refctr ++;</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  node->parent = parent;</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  node->name_next = f->name_table.array[hash];</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  f->name_table.array[hash] = node;</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  f->name_table.use++;</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span> </div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">if</span> (f->name_table.use >= f->name_table.size / 2)</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  rehash_name(f);</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span> </div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> }</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> </div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span> <span class="keyword">static</span> <span class="keywordtype">void</span> delete_node(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <span class="keywordflow">if</span> (f->conf.debug)</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  fprintf(stderr, <span class="stringliteral">"DELETE: %llu\n"</span>,</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) node->nodeid);</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span> </div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  assert(node->treelock == 0);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  unhash_name(f, node);</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <span class="keywordflow">if</span> (lru_enabled(f))</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  remove_node_lru(node);</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  unhash_id(f, node);</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  free_node(f, node);</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span> }</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span> </div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unref_node(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span> {</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  assert(node->refctr > 0);</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  node->refctr --;</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="keywordflow">if</span> (!node->refctr)</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  delete_node(f, node);</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> }</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span> </div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span> <span class="keyword">static</span> <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> next_id(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span> {</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  f->ctr = (f->ctr + 1) & 0xffffffff;</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="keywordflow">if</span> (!f->ctr)</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  f->generation ++;</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  } <span class="keywordflow">while</span> (f->ctr == 0 || f->ctr == FUSE_UNKNOWN_INO ||</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  get_node_nocheck(f, f->ctr) != NULL);</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="keywordflow">return</span> f->ctr;</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span> }</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span> </div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> <span class="keyword">static</span> <span class="keyword">struct </span>node *lookup_node(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span> {</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keywordtype">size_t</span> hash = name_hash(f, parent, name);</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span> </div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="keywordflow">for</span> (node = f->name_table.array[hash]; node != NULL; node = node->name_next)</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keywordflow">if</span> (node->parent->nodeid == parent &&</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  strcmp(node->name, name) == 0)</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span> </div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span> }</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span> </div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span> <span class="keyword">static</span> <span class="keywordtype">void</span> inc_nlookup(<span class="keyword">struct</span> node *node)</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span> {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <span class="keywordflow">if</span> (!node->nlookup)</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  node->refctr++;</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  node->nlookup++;</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span> }</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span> </div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span> <span class="keyword">static</span> <span class="keyword">struct </span>node *find_node(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span> {</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span> </div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <span class="keywordflow">if</span> (!name)</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  node = get_node(f, parent);</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  node = lookup_node(f, parent, name);</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="keywordflow">if</span> (node == NULL) {</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  node = alloc_node(f);</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="keywordflow">if</span> (node == NULL)</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="keywordflow">goto</span> out_err;</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span> </div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  node->nodeid = next_id(f);</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  node->generation = f->generation;</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordflow">if</span> (f->conf.remember)</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  inc_nlookup(node);</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span> </div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="keywordflow">if</span> (hash_name(f, node, parent, name) == -1) {</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  free_node(f, node);</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  node = NULL;</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  <span class="keywordflow">goto</span> out_err;</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  }</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  hash_id(f, node);</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  <span class="keywordflow">if</span> (lru_enabled(f)) {</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keyword">struct </span>node_lru *lnode = node_lru(node);</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  init_list_head(&lnode->lru);</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  }</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (lru_enabled(f) && node->nlookup == 1) {</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  remove_node_lru(node);</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  }</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  inc_nlookup(node);</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span> out_err:</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> }</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span> </div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span> <span class="keyword">static</span> <span class="keywordtype">int</span> lookup_path_in_cache(<span class="keyword">struct</span> fuse *f,</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> *inop)</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span> {</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  <span class="keywordtype">char</span> *tmp = strdup(path);</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  <span class="keywordflow">if</span> (!tmp)</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span> </div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino = <a class="code" href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a>;</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span> </div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  <span class="keywordtype">int</span> err = 0;</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="keywordtype">char</span> *save_ptr;</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="keywordtype">char</span> *path_element = strtok_r(tmp, <span class="stringliteral">"/"</span>, &save_ptr);</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="keywordflow">while</span> (path_element != NULL) {</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="keyword">struct </span>node *node = lookup_node(f, ino, path_element);</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="keywordflow">if</span> (node == NULL) {</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  err = -ENOENT;</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  }</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  ino = node->nodeid;</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  path_element = strtok_r(NULL, <span class="stringliteral">"/"</span>, &save_ptr);</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  }</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  free(tmp);</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span> </div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  *inop = ino;</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span> }</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span> </div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span> <span class="keyword">static</span> <span class="keywordtype">char</span> *add_name(<span class="keywordtype">char</span> **buf, <span class="keywordtype">unsigned</span> *bufsize, <span class="keywordtype">char</span> *s, <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span> {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="keywordtype">size_t</span> len = strlen(name);</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span> </div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">if</span> (s - len <= *buf) {</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keywordtype">unsigned</span> pathlen = *bufsize - (s - *buf);</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordtype">unsigned</span> newbufsize = *bufsize;</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="keywordtype">char</span> *newbuf;</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span> </div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="keywordflow">while</span> (newbufsize < pathlen + len + 1) {</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="keywordflow">if</span> (newbufsize >= 0x80000000)</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  newbufsize = 0xffffffff;</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  newbufsize *= 2;</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  }</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span> </div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  newbuf = realloc(*buf, newbufsize);</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="keywordflow">if</span> (newbuf == NULL)</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span> </div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  *buf = newbuf;</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  s = newbuf + newbufsize - pathlen;</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  memmove(s, newbuf + *bufsize - pathlen, pathlen);</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  *bufsize = newbufsize;</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  }</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  s -= len;</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  strncpy(s, name, len);</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  s--;</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  *s = <span class="charliteral">'/'</span>;</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span> </div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="keywordflow">return</span> s;</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span> }</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span> </div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unlock_path(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">struct</span> node *wnode,</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  <span class="keyword">struct</span> node *end)</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span> {</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span> </div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  <span class="keywordflow">if</span> (wnode) {</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  assert(wnode->treelock == TREELOCK_WRITE);</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  wnode->treelock = 0;</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  }</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span> </div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keywordflow">for</span> (node = get_node(f, nodeid);</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  node != end && node->nodeid != <a class="code" href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a>; node = node->parent) {</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  assert(node->treelock != 0);</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  assert(node->treelock != TREELOCK_WAIT_OFFSET);</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  assert(node->treelock != TREELOCK_WRITE);</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  node->treelock--;</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  <span class="keywordflow">if</span> (node->treelock == TREELOCK_WAIT_OFFSET)</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  node->treelock = 0;</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  }</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span> }</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span> </div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span> <span class="keyword">static</span> <span class="keywordtype">int</span> try_get_path(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <span class="keywordtype">char</span> **path, <span class="keyword">struct</span> node **wnodep, <span class="keywordtype">bool</span> need_lock)</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span> {</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  <span class="keywordtype">unsigned</span> bufsize = 256;</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <span class="keywordtype">char</span> *buf;</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  <span class="keywordtype">char</span> *s;</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="keyword">struct </span>node *wnode = NULL;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> </div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  *path = NULL;</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span> </div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  err = -ENOMEM;</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  buf = malloc(bufsize);</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <span class="keywordflow">if</span> (buf == NULL)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="keywordflow">goto</span> out_err;</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span> </div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  s = buf + bufsize - 1;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  *s = <span class="charliteral">'\0'</span>;</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> </div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="keywordflow">if</span> (name != NULL) {</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  s = add_name(&buf, &bufsize, s, name);</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  err = -ENOMEM;</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <span class="keywordflow">if</span> (s == NULL)</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  }</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span> </div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  <span class="keywordflow">if</span> (wnodep) {</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  assert(need_lock);</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  wnode = lookup_node(f, nodeid, name);</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">if</span> (wnode) {</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  <span class="keywordflow">if</span> (wnode->treelock != 0) {</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  <span class="keywordflow">if</span> (wnode->treelock > 0)</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  wnode->treelock += TREELOCK_WAIT_OFFSET;</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  err = -EAGAIN;</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  }</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  wnode->treelock = TREELOCK_WRITE;</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  }</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  }</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> </div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <span class="keywordflow">for</span> (node = get_node(f, nodeid); node->nodeid != <a class="code" href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a>;</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  node = node->parent) {</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  err = -ENOENT;</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  <span class="keywordflow">if</span> (node->name == NULL || node->parent == NULL)</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="keywordflow">goto</span> out_unlock;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span> </div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  err = -ENOMEM;</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  s = add_name(&buf, &bufsize, s, node->name);</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordflow">if</span> (s == NULL)</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  <span class="keywordflow">goto</span> out_unlock;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span> </div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  <span class="keywordflow">if</span> (need_lock) {</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  err = -EAGAIN;</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="keywordflow">if</span> (node->treelock < 0)</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordflow">goto</span> out_unlock;</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> </div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  node->treelock++;</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  }</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  }</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span> </div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  <span class="keywordflow">if</span> (s[0])</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  memmove(buf, s, bufsize - (s - buf));</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  strcpy(buf, <span class="stringliteral">"/"</span>);</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> </div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  *path = buf;</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <span class="keywordflow">if</span> (wnodep)</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  *wnodep = wnode;</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span> </div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> </div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  out_unlock:</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  <span class="keywordflow">if</span> (need_lock)</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  unlock_path(f, nodeid, wnode, node);</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  out_free:</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  free(buf);</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> </div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  out_err:</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> }</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span> </div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span> <span class="keyword">static</span> <span class="keywordtype">void</span> queue_element_unlock(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> lock_queue_element *qe)</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span> {</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  <span class="keyword">struct </span>node *wnode;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span> </div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  <span class="keywordflow">if</span> (qe->first_locked) {</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  wnode = qe->wnode1 ? *qe->wnode1 : NULL;</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  unlock_path(f, qe->nodeid1, wnode, NULL);</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  qe->first_locked = <span class="keyword">false</span>;</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  }</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <span class="keywordflow">if</span> (qe->second_locked) {</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  wnode = qe->wnode2 ? *qe->wnode2 : NULL;</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  unlock_path(f, qe->nodeid2, wnode, NULL);</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  qe->second_locked = <span class="keyword">false</span>;</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  }</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span> }</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> </div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> <span class="keyword">static</span> <span class="keywordtype">void</span> queue_element_wakeup(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> lock_queue_element *qe)</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span> {</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  <span class="keywordtype">bool</span> first = (qe == f->lockq);</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> </div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="keywordflow">if</span> (!qe->path1) {</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="comment">/* Just waiting for it to be unlocked */</span></div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="keywordflow">if</span> (get_node(f, qe->nodeid1)->treelock == 0)</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  pthread_cond_signal(&qe->cond);</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span> </div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  }</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span> </div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="keywordflow">if</span> (!qe->first_locked) {</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  err = try_get_path(f, qe->nodeid1, qe->name1, qe->path1,</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  qe->wnode1, <span class="keyword">true</span>);</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  qe->first_locked = <span class="keyword">true</span>;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err != -EAGAIN)</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  <span class="keywordflow">goto</span> err_unlock;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  }</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  <span class="keywordflow">if</span> (!qe->second_locked && qe->path2) {</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  err = try_get_path(f, qe->nodeid2, qe->name2, qe->path2,</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  qe->wnode2, <span class="keyword">true</span>);</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  qe->second_locked = <span class="keyword">true</span>;</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err != -EAGAIN)</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  <span class="keywordflow">goto</span> err_unlock;</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  }</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span> </div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  <span class="keywordflow">if</span> (qe->first_locked && (qe->second_locked || !qe->path2)) {</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  err = 0;</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="keywordflow">goto</span> done;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  }</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span> </div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  <span class="comment">/*</span></div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> <span class="comment"> * Only let the first element be partially locked otherwise there could</span></div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span> <span class="comment"> * be a deadlock.</span></div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> <span class="comment"> *</span></div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span> <span class="comment"> * But do allow the first element to be partially locked to prevent</span></div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span> <span class="comment"> * starvation.</span></div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span> <span class="comment"> */</span></div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  queue_element_unlock(f, qe);</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span> </div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="comment">/* keep trying */</span></div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span> </div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span> err_unlock:</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  queue_element_unlock(f, qe);</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> done:</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  qe->err = err;</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  qe->done = <span class="keyword">true</span>;</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  pthread_cond_signal(&qe->cond);</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> }</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span> </div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> <span class="keyword">static</span> <span class="keywordtype">void</span> wake_up_queued(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> {</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  <span class="keyword">struct </span>lock_queue_element *qe;</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> </div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="keywordflow">for</span> (qe = f->lockq; qe != NULL; qe = qe->next)</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  queue_element_wakeup(f, qe);</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> }</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> </div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> <span class="keyword">static</span> <span class="keywordtype">void</span> debug_path(<span class="keyword">struct</span> fuse *f, <span class="keyword">const</span> <span class="keywordtype">char</span> *msg, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid,</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">bool</span> wr)</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> {</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  <span class="keywordflow">if</span> (f->conf.debug) {</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="keyword">struct </span>node *wnode = NULL;</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span> </div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  <span class="keywordflow">if</span> (wr)</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  wnode = lookup_node(f, nodeid, name);</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> </div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  <span class="keywordflow">if</span> (wnode) {</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  fprintf(stderr, <span class="stringliteral">"%s %llu (w)\n"</span>,</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  msg, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) wnode->nodeid);</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  fprintf(stderr, <span class="stringliteral">"%s %llu\n"</span>,</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  msg, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) nodeid);</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  }</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  }</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span> }</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span> </div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> <span class="keyword">static</span> <span class="keywordtype">void</span> queue_path(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> lock_queue_element *qe)</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span> {</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  <span class="keyword">struct </span>lock_queue_element **qp;</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  qe->done = <span class="keyword">false</span>;</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  qe->first_locked = <span class="keyword">false</span>;</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  qe->second_locked = <span class="keyword">false</span>;</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  pthread_cond_init(&qe->cond, NULL);</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  qe->next = NULL;</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  <span class="keywordflow">for</span> (qp = &f->lockq; *qp != NULL; qp = &(*qp)->next);</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  *qp = qe;</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span> }</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span> </div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span> <span class="keyword">static</span> <span class="keywordtype">void</span> dequeue_path(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> lock_queue_element *qe)</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> {</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <span class="keyword">struct </span>lock_queue_element **qp;</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> </div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  pthread_cond_destroy(&qe->cond);</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  <span class="keywordflow">for</span> (qp = &f->lockq; *qp != qe; qp = &(*qp)->next);</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  *qp = qe->next;</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> }</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> </div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> <span class="keyword">static</span> <span class="keywordtype">int</span> wait_path(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> lock_queue_element *qe)</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span> {</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  queue_path(f, qe);</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> </div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  pthread_cond_wait(&qe->cond, &f->lock);</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  } <span class="keywordflow">while</span> (!qe->done);</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span> </div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  dequeue_path(f, qe);</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span> </div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  <span class="keywordflow">return</span> qe->err;</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> }</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> </div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span> <span class="keyword">static</span> <span class="keywordtype">int</span> get_path_common(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="keywordtype">char</span> **path, <span class="keyword">struct</span> node **wnode)</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span> {</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span> </div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  err = try_get_path(f, nodeid, name, path, wnode, <span class="keyword">true</span>);</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  <span class="keywordflow">if</span> (err == -EAGAIN) {</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <span class="keyword">struct </span>lock_queue_element qe = {</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  .nodeid1 = nodeid,</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  .name1 = name,</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  .path1 = path,</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  .wnode1 = wnode,</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  };</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  debug_path(f, <span class="stringliteral">"QUEUE PATH"</span>, nodeid, name, !!wnode);</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  err = wait_path(f, &qe);</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  debug_path(f, <span class="stringliteral">"DEQUEUE PATH"</span>, nodeid, name, !!wnode);</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  }</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span> </div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span> }</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span> </div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> <span class="keyword">static</span> <span class="keywordtype">int</span> get_path(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keywordtype">char</span> **path)</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span> {</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  <span class="keywordflow">return</span> get_path_common(f, nodeid, NULL, path, NULL);</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> }</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> </div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> <span class="keyword">static</span> <span class="keywordtype">int</span> get_path_nullok(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keywordtype">char</span> **path)</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> {</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  <span class="keywordtype">int</span> err = 0;</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> </div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="keywordflow">if</span> (f->conf.nullpath_ok) {</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  *path = NULL;</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  err = get_path_common(f, nodeid, NULL, path, NULL);</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  <span class="keywordflow">if</span> (err == -ENOENT)</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  err = 0;</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  }</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span> </div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span> }</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> </div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span> <span class="keyword">static</span> <span class="keywordtype">int</span> get_path_name(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keywordtype">char</span> **path)</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span> {</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordflow">return</span> get_path_common(f, nodeid, name, path, NULL);</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span> }</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> </div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span> <span class="keyword">static</span> <span class="keywordtype">int</span> get_path_wrlock(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <span class="keywordtype">char</span> **path, <span class="keyword">struct</span> node **wnode)</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> {</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <span class="keywordflow">return</span> get_path_common(f, nodeid, name, path, wnode);</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span> }</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span> </div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> <span class="preprocessor">#if defined(__FreeBSD__)</span></div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span> <span class="preprocessor">#define CHECK_DIR_LOOP</span></div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span> </div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span> <span class="preprocessor">#if defined(CHECK_DIR_LOOP)</span></div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> <span class="keyword">static</span> <span class="keywordtype">int</span> check_dir_loop(<span class="keyword">struct</span> fuse *f,</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid1, <span class="keyword">const</span> <span class="keywordtype">char</span> *name1,</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid2, <span class="keyword">const</span> <span class="keywordtype">char</span> *name2)</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span> {</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  <span class="keyword">struct </span>node *node, *node1, *node2;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> id1, id2;</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span> </div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  node1 = lookup_node(f, nodeid1, name1);</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  id1 = node1 ? node1->nodeid : nodeid1;</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span> </div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  node2 = lookup_node(f, nodeid2, name2);</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  id2 = node2 ? node2->nodeid : nodeid2;</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span> </div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  <span class="keywordflow">for</span> (node = get_node(f, id2); node->nodeid != <a class="code" href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a>;</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  node = node->parent) {</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  <span class="keywordflow">if</span> (node->name == NULL || node->parent == NULL)</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> </div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  <span class="keywordflow">if</span> (node->nodeid != id2 && node->nodeid == id1)</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="keywordflow">return</span> -EINVAL;</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  }</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> </div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <span class="keywordflow">if</span> (node2)</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  {</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  <span class="keywordflow">for</span> (node = get_node(f, id1); node->nodeid != <a class="code" href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a>;</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  node = node->parent) {</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  <span class="keywordflow">if</span> (node->name == NULL || node->parent == NULL)</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span> </div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  <span class="keywordflow">if</span> (node->nodeid != id1 && node->nodeid == id2)</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="keywordflow">return</span> -ENOTEMPTY;</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  }</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  }</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span> </div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span> }</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> </div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> <span class="keyword">static</span> <span class="keywordtype">int</span> try_get_path2(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid1, <span class="keyword">const</span> <span class="keywordtype">char</span> *name1,</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid2, <span class="keyword">const</span> <span class="keywordtype">char</span> *name2,</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <span class="keywordtype">char</span> **path1, <span class="keywordtype">char</span> **path2,</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <span class="keyword">struct</span> node **wnode1, <span class="keyword">struct</span> node **wnode2)</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> {</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span> </div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  <span class="comment">/* FIXME: locking two paths needs deadlock checking */</span></div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  err = try_get_path(f, nodeid1, name1, path1, wnode1, <span class="keyword">true</span>);</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  err = try_get_path(f, nodeid2, name2, path2, wnode2, <span class="keyword">true</span>);</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  <span class="keyword">struct </span>node *wn1 = wnode1 ? *wnode1 : NULL;</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span> </div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  unlock_path(f, nodeid1, wn1, NULL);</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  free(*path1);</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  }</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  }</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span> }</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> </div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span> <span class="keyword">static</span> <span class="keywordtype">int</span> get_path2(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid1, <span class="keyword">const</span> <span class="keywordtype">char</span> *name1,</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid2, <span class="keyword">const</span> <span class="keywordtype">char</span> *name2,</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  <span class="keywordtype">char</span> **path1, <span class="keywordtype">char</span> **path2,</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="keyword">struct</span> node **wnode1, <span class="keyword">struct</span> node **wnode2)</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span> {</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span> </div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> </div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span> <span class="preprocessor">#if defined(CHECK_DIR_LOOP)</span></div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordflow">if</span> (name1)</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  {</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="comment">// called during rename; perform dir loop check</span></div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  err = check_dir_loop(f, nodeid1, name1, nodeid2, name2);</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  <span class="keywordflow">if</span> (err)</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <span class="keywordflow">goto</span> out_unlock;</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  }</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span> </div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  err = try_get_path2(f, nodeid1, name1, nodeid2, name2,</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  path1, path2, wnode1, wnode2);</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  <span class="keywordflow">if</span> (err == -EAGAIN) {</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="keyword">struct </span>lock_queue_element qe = {</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  .nodeid1 = nodeid1,</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  .name1 = name1,</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  .path1 = path1,</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  .wnode1 = wnode1,</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  .nodeid2 = nodeid2,</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  .name2 = name2,</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  .path2 = path2,</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  .wnode2 = wnode2,</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  };</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> </div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  debug_path(f, <span class="stringliteral">"QUEUE PATH1"</span>, nodeid1, name1, !!wnode1);</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  debug_path(f, <span class="stringliteral">" PATH2"</span>, nodeid2, name2, !!wnode2);</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  err = wait_path(f, &qe);</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  debug_path(f, <span class="stringliteral">"DEQUEUE PATH1"</span>, nodeid1, name1, !!wnode1);</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  debug_path(f, <span class="stringliteral">" PATH2"</span>, nodeid2, name2, !!wnode2);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  }</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span> </div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span> <span class="preprocessor">#if defined(CHECK_DIR_LOOP)</span></div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span> out_unlock:</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span> </div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> }</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> </div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_path_wrlock(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid,</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  <span class="keyword">struct</span> node *wnode, <span class="keywordtype">char</span> *path)</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> {</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  unlock_path(f, nodeid, wnode, NULL);</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="keywordflow">if</span> (f->lockq)</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  wake_up_queued(f);</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  free(path);</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> }</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span> </div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_path(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keywordtype">char</span> *path)</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span> {</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <span class="keywordflow">if</span> (path)</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  free_path_wrlock(f, nodeid, NULL, path);</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> }</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span> </div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_path2(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid1, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid2,</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="keyword">struct</span> node *wnode1, <span class="keyword">struct</span> node *wnode2,</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <span class="keywordtype">char</span> *path1, <span class="keywordtype">char</span> *path2)</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> {</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  unlock_path(f, nodeid1, wnode1, NULL);</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  unlock_path(f, nodeid2, wnode2, NULL);</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  wake_up_queued(f);</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  free(path1);</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  free(path2);</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> }</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span> </div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span> <span class="keyword">static</span> <span class="keywordtype">void</span> forget_node(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, uint64_t nlookup)</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span> {</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <span class="keywordflow">if</span> (nodeid == <a class="code" href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a>)</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  node = get_node(f, nodeid);</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> </div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <span class="comment">/*</span></div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> <span class="comment"> * Node may still be locked due to interrupt idiocy in open,</span></div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span> <span class="comment"> * create and opendir</span></div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span> <span class="comment"> */</span></div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  <span class="keywordflow">while</span> (node->nlookup == nlookup && node->treelock) {</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  <span class="keyword">struct </span>lock_queue_element qe = {</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  .nodeid1 = nodeid,</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  };</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span> </div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  debug_path(f, <span class="stringliteral">"QUEUE PATH (forget)"</span>, nodeid, NULL, <span class="keyword">false</span>);</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  queue_path(f, &qe);</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span> </div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  pthread_cond_wait(&qe.cond, &f->lock);</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  } <span class="keywordflow">while</span> (node->nlookup == nlookup && node->treelock);</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span> </div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  dequeue_path(f, &qe);</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  debug_path(f, <span class="stringliteral">"DEQUEUE_PATH (forget)"</span>, nodeid, NULL, <span class="keyword">false</span>);</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  }</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span> </div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  assert(node->nlookup >= nlookup);</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  node->nlookup -= nlookup;</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <span class="keywordflow">if</span> (!node->nlookup) {</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  unref_node(f, node);</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (lru_enabled(f) && node->nlookup == 1) {</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  set_forget_time(f, node);</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  }</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> }</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> </div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unlink_node(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> node *node)</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span> {</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  <span class="keywordflow">if</span> (f->conf.remember) {</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  assert(node->nlookup > 1);</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  node->nlookup--;</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  }</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  unhash_name(f, node);</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span> }</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> </div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span> <span class="keyword">static</span> <span class="keywordtype">void</span> remove_node(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> dir, <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span> {</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span> </div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  node = lookup_node(f, dir, name);</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  <span class="keywordflow">if</span> (node != NULL)</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  unlink_node(f, node);</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span> }</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> </div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> <span class="keyword">static</span> <span class="keywordtype">int</span> rename_node(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> olddir, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldname,</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> newdir, <span class="keyword">const</span> <span class="keywordtype">char</span> *newname, <span class="keywordtype">int</span> hide)</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span> {</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keyword">struct </span>node *newnode;</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  <span class="keywordtype">int</span> err = 0;</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span> </div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  node = lookup_node(f, olddir, oldname);</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  newnode = lookup_node(f, newdir, newname);</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="keywordflow">if</span> (node == NULL)</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span> </div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  <span class="keywordflow">if</span> (newnode != NULL) {</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  <span class="keywordflow">if</span> (hide) {</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  fprintf(stderr, <span class="stringliteral">"fuse: hidden file got created during hiding\n"</span>);</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  err = -EBUSY;</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  }</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  unlink_node(f, newnode);</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  }</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span> </div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  unhash_name(f, node);</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  <span class="keywordflow">if</span> (hash_name(f, node, newdir, newname) == -1) {</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  err = -ENOMEM;</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  }</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span> </div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  <span class="keywordflow">if</span> (hide)</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  node->is_hidden = 1;</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span> </div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span> out:</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span> }</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span> </div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span> <span class="keyword">static</span> <span class="keywordtype">int</span> exchange_node(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> olddir, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldname,</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> newdir, <span class="keyword">const</span> <span class="keywordtype">char</span> *newname)</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span> {</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="keyword">struct </span>node *oldnode;</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  <span class="keyword">struct </span>node *newnode;</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span> </div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  oldnode = lookup_node(f, olddir, oldname);</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  newnode = lookup_node(f, newdir, newname);</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span> </div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="keywordflow">if</span> (oldnode)</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  unhash_name(f, oldnode);</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  <span class="keywordflow">if</span> (newnode)</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  unhash_name(f, newnode);</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> </div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  err = -ENOMEM;</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  <span class="keywordflow">if</span> (oldnode) {</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  <span class="keywordflow">if</span> (hash_name(f, oldnode, newdir, newname) == -1)</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  }</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <span class="keywordflow">if</span> (newnode) {</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  <span class="keywordflow">if</span> (hash_name(f, newnode, olddir, oldname) == -1)</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  }</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  err = 0;</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> out:</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> }</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> </div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> <span class="keyword">static</span> <span class="keywordtype">void</span> set_stat(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">struct</span> stat *stbuf)</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> {</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  <span class="keywordflow">if</span> (!f->conf.use_ino)</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  stbuf->st_ino = nodeid;</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  <span class="keywordflow">if</span> (f->conf.set_mode)</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  stbuf->st_mode = (stbuf->st_mode & S_IFMT) |</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  (0777 & ~f->conf.umask);</div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  <span class="keywordflow">if</span> (f->conf.set_uid)</div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  stbuf->st_uid = f->conf.uid;</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  <span class="keywordflow">if</span> (f->conf.set_gid)</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  stbuf->st_gid = f->conf.gid;</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> }</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> </div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse *req_fuse(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> {</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  <span class="keywordflow">return</span> (<span class="keyword">struct</span> fuse *) <a class="code" href="fuse__lowlevel_8h.html#aab00273c65d124e44abcf2374f9c504b">fuse_req_userdata</a>(req);</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> }</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span> </div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_intr_sighandler(<span class="keywordtype">int</span> sig)</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> {</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  (void) sig;</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  <span class="comment">/* Nothing to do */</span></div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> }</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> </div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> <span class="keyword">struct </span>fuse_intr_data {</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  pthread_t id;</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  pthread_cond_t cond;</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  <span class="keywordtype">int</span> finished;</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span> };</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span> </div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_interrupt(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">void</span> *d_)</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span> {</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  <span class="keyword">struct </span>fuse_intr_data *d = d_;</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  <span class="keyword">struct </span>fuse *f = req_fuse(req);</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span> </div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  <span class="keywordflow">if</span> (d->id == pthread_self())</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  <span class="keywordflow">while</span> (!d->finished) {</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  <span class="keyword">struct </span>timeval now;</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <span class="keyword">struct </span>timespec timeout;</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> </div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  pthread_kill(d->id, f->conf.intr_signal);</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  gettimeofday(&now, NULL);</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  timeout.tv_sec = now.tv_sec + 1;</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  timeout.tv_nsec = now.tv_usec * 1000;</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  pthread_cond_timedwait(&d->cond, &f->lock, &timeout);</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  }</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span> }</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span> </div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_do_finish_interrupt(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req,</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  <span class="keyword">struct</span> fuse_intr_data *d)</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span> {</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  d->finished = 1;</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  pthread_cond_broadcast(&d->cond);</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <a class="code" href="fuse__lowlevel_8h.html#ab3cdb9744f033e37a72984489343940f">fuse_req_interrupt_func</a>(req, NULL, NULL);</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  pthread_cond_destroy(&d->cond);</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span> }</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span> </div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_do_prepare_interrupt(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">struct</span> fuse_intr_data *d)</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span> {</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  d->id = pthread_self();</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  pthread_cond_init(&d->cond, NULL);</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  d->finished = 0;</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  <a class="code" href="fuse__lowlevel_8h.html#ab3cdb9744f033e37a72984489343940f">fuse_req_interrupt_func</a>(req, fuse_interrupt, d);</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span> }</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span> </div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> fuse_finish_interrupt(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req,</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="keyword">struct</span> fuse_intr_data *d)</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span> {</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  <span class="keywordflow">if</span> (f->conf.intr)</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  fuse_do_finish_interrupt(f, req, d);</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span> }</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span> </div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> fuse_prepare_interrupt(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req,</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  <span class="keyword">struct</span> fuse_intr_data *d)</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span> {</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <span class="keywordflow">if</span> (f->conf.intr)</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  fuse_do_prepare_interrupt(req, d);</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span> }</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span> </div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* file_info_string(<span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi,</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  <span class="keywordtype">char</span>* buf, <span class="keywordtype">size_t</span> len)</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> {</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="keywordflow">if</span>(fi == NULL)</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <span class="keywordflow">return</span> <span class="stringliteral">"NULL"</span>;</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  snprintf(buf, len, <span class="stringliteral">"%llu"</span>, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>);</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  <span class="keywordflow">return</span> buf;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span> }</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span> </div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span> <span class="keywordtype">int</span> fuse_fs_getattr(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">struct</span> stat *buf,</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span> {</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  <span class="keywordflow">if</span> (fs->op.getattr) {</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  <span class="keywordflow">if</span> (fs->debug) {</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  <span class="keywordtype">char</span> buf[10];</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  fprintf(stderr, <span class="stringliteral">"getattr[%s] %s\n"</span>,</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  file_info_string(fi, buf, <span class="keyword">sizeof</span>(buf)),</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  path);</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  }</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  <span class="keywordflow">return</span> fs->op.getattr(path, buf, fi);</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  }</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> }</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span> </div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span> <span class="keywordtype">int</span> fuse_fs_rename(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldpath,</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *newpath, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> {</div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  <span class="keywordflow">if</span> (fs->op.rename) {</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  fprintf(stderr, <span class="stringliteral">"rename %s %s 0x%x\n"</span>, oldpath, newpath,</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  flags);</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span> </div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  <span class="keywordflow">return</span> fs->op.rename(oldpath, newpath, flags);</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  }</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span> }</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span> </div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span> <span class="keywordtype">int</span> fuse_fs_unlink(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path)</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span> {</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  <span class="keywordflow">if</span> (fs->op.unlink) {</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  fprintf(stderr, <span class="stringliteral">"unlink %s\n"</span>, path);</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span> </div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  <span class="keywordflow">return</span> fs->op.unlink(path);</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>  }</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span> }</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span> </div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> <span class="keywordtype">int</span> fuse_fs_rmdir(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path)</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span> {</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="keywordflow">if</span> (fs->op.rmdir) {</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  fprintf(stderr, <span class="stringliteral">"rmdir %s\n"</span>, path);</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span> </div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  <span class="keywordflow">return</span> fs->op.rmdir(path);</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  }</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span> }</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span> </div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span> <span class="keywordtype">int</span> fuse_fs_symlink(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *linkname, <span class="keyword">const</span> <span class="keywordtype">char</span> *path)</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span> {</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>  <span class="keywordflow">if</span> (fs->op.symlink) {</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>  fprintf(stderr, <span class="stringliteral">"symlink %s %s\n"</span>, linkname, path);</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span> </div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  <span class="keywordflow">return</span> fs->op.symlink(linkname, path);</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  }</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span> }</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span> </div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> <span class="keywordtype">int</span> fuse_fs_link(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldpath, <span class="keyword">const</span> <span class="keywordtype">char</span> *newpath)</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span> {</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  <span class="keywordflow">if</span> (fs->op.link) {</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  fprintf(stderr, <span class="stringliteral">"link %s %s\n"</span>, oldpath, newpath);</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span> </div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>  <span class="keywordflow">return</span> fs->op.link(oldpath, newpath);</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  }</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span> }</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span> </div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span> <span class="keywordtype">int</span> fuse_fs_release(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span> {</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>  <span class="keywordflow">if</span> (fs->op.release) {</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  fprintf(stderr, <span class="stringliteral">"release%s[%llu] flags: 0x%x\n"</span>,</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  fi-><a class="code" href="structfuse__file__info.html#a9c1571cb4b6be75827f48aac5891606c">flush</a> ? <span class="stringliteral">"+flush"</span> : <span class="stringliteral">""</span>,</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>);</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span> </div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  <span class="keywordflow">return</span> fs->op.release(path, fi);</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  }</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> }</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span> </div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span> <span class="keywordtype">int</span> fuse_fs_opendir(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span> {</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>  <span class="keywordflow">if</span> (fs->op.opendir) {</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span> </div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  fprintf(stderr, <span class="stringliteral">"opendir flags: 0x%x %s\n"</span>, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>,</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  path);</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span> </div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  err = fs->op.opendir(path, fi);</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span> </div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>  <span class="keywordflow">if</span> (fs->debug && !err)</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  fprintf(stderr, <span class="stringliteral">" opendir[%llu] flags: 0x%x %s\n"</span>,</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>, path);</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span> </div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  }</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> }</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span> </div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> <span class="keywordtype">int</span> fuse_fs_open(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> {</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  <span class="keywordflow">if</span> (fs->op.open) {</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span> </div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  fprintf(stderr, <span class="stringliteral">"open flags: 0x%x %s\n"</span>, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>,</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  path);</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span> </div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  err = fs->op.open(path, fi);</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span> </div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  <span class="keywordflow">if</span> (fs->debug && !err)</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  fprintf(stderr, <span class="stringliteral">" open[%llu] flags: 0x%x %s\n"</span>,</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>, path);</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span> </div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  }</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span> }</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span> </div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_free_buf(<span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf)</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span> {</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  <span class="keywordflow">if</span> (buf != NULL) {</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  <span class="keywordtype">size_t</span> i;</div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span> </div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  <span class="keywordflow">for</span> (i = 0; i < buf-><a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a>; i++)</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  <span class="keywordflow">if</span> (!(buf-><a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>))</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  free(buf-><a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[i].<a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a>);</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  free(buf);</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  }</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span> }</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span> </div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span> <span class="keywordtype">int</span> fuse_fs_read_buf(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> **bufp, <span class="keywordtype">size_t</span> size, off_t off,</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span> {</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  <span class="keywordflow">if</span> (fs->op.read || fs->op.read_buf) {</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> </div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  fprintf(stderr,</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <span class="stringliteral">"read[%llu] %zu bytes from %llu flags: 0x%x\n"</span>,</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  size, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>);</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span> </div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  <span class="keywordflow">if</span> (fs->op.read_buf) {</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  res = fs->op.read_buf(path, bufp, size, off, fi);</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *<a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>;</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  <span class="keywordtype">void</span> *mem;</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span> </div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  buf = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a>));</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  <span class="keywordflow">if</span> (buf == NULL)</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span> </div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  mem = malloc(size);</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  <span class="keywordflow">if</span> (mem == NULL) {</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  free(buf);</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  }</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  *buf = FUSE_BUFVEC_INIT(size);</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  buf-><a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a> = mem;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  *bufp = <a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>;</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span> </div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  res = fs->op.read(path, mem, size, off, fi);</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  <span class="keywordflow">if</span> (res >= 0)</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  buf-><a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = res;</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  }</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span> </div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  <span class="keywordflow">if</span> (fs->debug && res >= 0)</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  fprintf(stderr, <span class="stringliteral">" read[%llu] %zu bytes from %llu\n"</span>,</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  <a class="code" href="fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a>(*bufp),</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off);</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  <span class="keywordflow">if</span> (res >= 0 && <a class="code" href="fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a>(*bufp) > size)</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  fprintf(stderr, <span class="stringliteral">"fuse: read too many bytes\n"</span>);</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span> </div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  <span class="keywordflow">if</span> (res < 0)</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span> </div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  }</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span> }</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span> </div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span> <span class="keywordtype">int</span> fuse_fs_read(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">char</span> *mem, <span class="keywordtype">size_t</span> size,</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  off_t off, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span> {</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  <span class="keywordflow">if</span> (fs->op.read || fs->op.read_buf) {</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span> </div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  fprintf(stderr,</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  <span class="stringliteral">"read[%llu] %zu bytes from %llu flags: 0x%x\n"</span>,</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  size, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>);</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span> </div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  <span class="keywordflow">if</span> (fs->op.read_buf) {</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf = NULL;</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span> </div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  res = fs->op.read_buf(path, &buf, size, off, fi);</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  <span class="keywordflow">if</span> (res == 0) {</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> dst = FUSE_BUFVEC_INIT(size);</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span> </div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  dst.<a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a> = mem;</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  res = <a class="code" href="fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a>(&dst, buf, 0);</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  }</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>  fuse_free_buf(buf);</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  res = fs->op.read(path, mem, size, off, fi);</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  }</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span> </div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  <span class="keywordflow">if</span> (fs->debug && res >= 0)</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  fprintf(stderr, <span class="stringliteral">" read[%llu] %u bytes from %llu\n"</span>,</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  res,</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off);</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>  <span class="keywordflow">if</span> (res >= 0 && res > (<span class="keywordtype">int</span>) size)</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  fprintf(stderr, <span class="stringliteral">"fuse: read too many bytes\n"</span>);</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span> </div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  }</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span> }</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span> </div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span> <span class="keywordtype">int</span> fuse_fs_write_buf(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf, off_t off,</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span> {</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="keywordflow">if</span> (fs->op.write_buf || fs->op.write) {</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  <span class="keywordtype">size_t</span> size = <a class="code" href="fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a>(buf);</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span> </div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  assert(buf-><a class="code" href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">idx</a> == 0 && buf-><a class="code" href="structfuse__bufvec.html#a0fbb583168d52562f0f848562ecf63bc">off</a> == 0);</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  fprintf(stderr,</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  <span class="stringliteral">"write%s[%llu] %zu bytes to %llu flags: 0x%x\n"</span>,</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  fi-><a class="code" href="structfuse__file__info.html#a984187caa62aafc15abf9ff621667f3d">writepage</a> ? <span class="stringliteral">"page"</span> : <span class="stringliteral">""</span>,</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  size,</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off,</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>);</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span> </div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  <span class="keywordflow">if</span> (fs->op.write_buf) {</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  res = fs->op.write_buf(path, buf, off, fi);</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  <span class="keywordtype">void</span> *mem = NULL;</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  <span class="keyword">struct </span><a class="code" href="structfuse__buf.html">fuse_buf</a> *flatbuf;</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> tmp = FUSE_BUFVEC_INIT(size);</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span> </div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  <span class="keywordflow">if</span> (buf-><a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a> == 1 &&</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  !(buf-><a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>)) {</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  flatbuf = &buf-><a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0];</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  res = -ENOMEM;</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  mem = malloc(size);</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  <span class="keywordflow">if</span> (mem == NULL)</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span> </div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  tmp.<a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a> = mem;</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  res = <a class="code" href="fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a>(&tmp, buf, 0);</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  <span class="keywordflow">if</span> (res <= 0)</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span> </div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  tmp.<a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = res;</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  flatbuf = &tmp.<a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0];</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  }</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span> </div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  res = fs->op.write(path, flatbuf-><a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a>, flatbuf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a>,</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  off, fi);</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span> out_free:</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  free(mem);</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  }</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span> out:</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="keywordflow">if</span> (fs->debug && res >= 0)</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  fprintf(stderr, <span class="stringliteral">" write%s[%llu] %u bytes to %llu\n"</span>,</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  fi-><a class="code" href="structfuse__file__info.html#a984187caa62aafc15abf9ff621667f3d">writepage</a> ? <span class="stringliteral">"page"</span> : <span class="stringliteral">""</span>,</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, res,</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off);</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <span class="keywordflow">if</span> (res > (<span class="keywordtype">int</span>) size)</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  fprintf(stderr, <span class="stringliteral">"fuse: wrote too many bytes\n"</span>);</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span> </div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  }</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span> }</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span> </div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span> <span class="keywordtype">int</span> fuse_fs_write(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">const</span> <span class="keywordtype">char</span> *mem,</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  <span class="keywordtype">size_t</span> size, off_t off, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span> {</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> bufv = FUSE_BUFVEC_INIT(size);</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span> </div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  bufv.<a class="code" href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">buf</a>[0].<a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a> = (<span class="keywordtype">void</span> *) mem;</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span> </div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  <span class="keywordflow">return</span> fuse_fs_write_buf(fs, path, &bufv, off, fi);</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span> }</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span> </div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span> <span class="keywordtype">int</span> fuse_fs_fsync(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">int</span> datasync,</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> {</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <span class="keywordflow">if</span> (fs->op.fsync) {</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  fprintf(stderr, <span class="stringliteral">"fsync[%llu] datasync: %i\n"</span>,</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, datasync);</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span> </div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  <span class="keywordflow">return</span> fs->op.fsync(path, datasync, fi);</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  }</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span> }</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span> </div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span> <span class="keywordtype">int</span> fuse_fs_fsyncdir(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">int</span> datasync,</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span> {</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  <span class="keywordflow">if</span> (fs->op.fsyncdir) {</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  fprintf(stderr, <span class="stringliteral">"fsyncdir[%llu] datasync: %i\n"</span>,</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, datasync);</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span> </div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  <span class="keywordflow">return</span> fs->op.fsyncdir(path, datasync, fi);</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  }</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span> }</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span> </div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span> <span class="keywordtype">int</span> fuse_fs_flush(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span> {</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <span class="keywordflow">if</span> (fs->op.flush) {</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  fprintf(stderr, <span class="stringliteral">"flush[%llu]\n"</span>,</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>);</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span> </div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  <span class="keywordflow">return</span> fs->op.flush(path, fi);</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  }</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span> }</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span> </div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span> <span class="keywordtype">int</span> fuse_fs_statfs(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">struct</span> statvfs *buf)</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span> {</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <span class="keywordflow">if</span> (fs->op.statfs) {</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  fprintf(stderr, <span class="stringliteral">"statfs %s\n"</span>, path);</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span> </div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <span class="keywordflow">return</span> fs->op.statfs(path, buf);</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  buf->f_namemax = 255;</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  buf->f_bsize = 512;</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  }</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span> }</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span> </div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span> <span class="keywordtype">int</span> fuse_fs_releasedir(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span> {</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="keywordflow">if</span> (fs->op.releasedir) {</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  fprintf(stderr, <span class="stringliteral">"releasedir[%llu] flags: 0x%x\n"</span>,</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>);</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span> </div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <span class="keywordflow">return</span> fs->op.releasedir(path, fi);</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  }</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span> }</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span> </div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span> <span class="keywordtype">int</span> fuse_fs_readdir(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">void</span> *buf,</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  <a class="code" href="fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660">fuse_fill_dir_t</a> filler, off_t off,</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi,</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  <span class="keyword">enum</span> <a class="code" href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074">fuse_readdir_flags</a> flags)</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span> {</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  <span class="keywordflow">if</span> (fs->op.readdir) {</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  <span class="keywordflow">if</span> (fs->debug) {</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  fprintf(stderr, <span class="stringliteral">"readdir%s[%llu] from %llu\n"</span>,</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  (flags & <a class="code" href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074ad62ab7c23f966a76282921e9187ca441">FUSE_READDIR_PLUS</a>) ? <span class="stringliteral">"plus"</span> : <span class="stringliteral">""</span>,</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off);</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  }</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span> </div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  <span class="keywordflow">return</span> fs->op.readdir(path, buf, filler, off, fi, flags);</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  }</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span> }</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span> </div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span> <span class="keywordtype">int</span> fuse_fs_create(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, mode_t mode,</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span> {</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  <span class="keywordflow">if</span> (fs->op.create) {</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span> </div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  fprintf(stderr,</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  <span class="stringliteral">"create flags: 0x%x %s 0%o umask=0%03o\n"</span>,</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>, path, mode,</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()->umask);</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span> </div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  err = fs->op.create(path, mode, fi);</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span> </div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  <span class="keywordflow">if</span> (fs->debug && !err)</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  fprintf(stderr, <span class="stringliteral">" create[%llu] flags: 0x%x %s\n"</span>,</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, fi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>, path);</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span> </div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  }</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span> }</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span> </div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span> <span class="keywordtype">int</span> fuse_fs_lock(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keywordtype">int</span> cmd, <span class="keyword">struct</span> flock *lock)</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span> {</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  <span class="keywordflow">if</span> (fs->op.lock) {</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  fprintf(stderr, <span class="stringliteral">"lock[%llu] %s %s start: %llu len: %llu pid: %llu\n"</span>,</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  (cmd == F_GETLK ? <span class="stringliteral">"F_GETLK"</span> :</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  (cmd == F_SETLK ? <span class="stringliteral">"F_SETLK"</span> :</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  (cmd == F_SETLKW ? <span class="stringliteral">"F_SETLKW"</span> : <span class="stringliteral">"???"</span>))),</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  (lock->l_type == F_RDLCK ? <span class="stringliteral">"F_RDLCK"</span> :</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  (lock->l_type == F_WRLCK ? <span class="stringliteral">"F_WRLCK"</span> :</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  (lock->l_type == F_UNLCK ? <span class="stringliteral">"F_UNLCK"</span> :</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  <span class="stringliteral">"???"</span>))),</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) lock->l_start,</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) lock->l_len,</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) lock->l_pid);</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span> </div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>  <span class="keywordflow">return</span> fs->op.lock(path, fi, cmd, lock);</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  }</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> }</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span> </div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span> <span class="keywordtype">int</span> fuse_fs_flock(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keywordtype">int</span> op)</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span> {</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  <span class="keywordflow">if</span> (fs->op.flock) {</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <span class="keywordflow">if</span> (fs->debug) {</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <span class="keywordtype">int</span> xop = op & ~LOCK_NB;</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span> </div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  fprintf(stderr, <span class="stringliteral">"lock[%llu] %s%s\n"</span>,</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>,</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  xop == LOCK_SH ? <span class="stringliteral">"LOCK_SH"</span> :</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  (xop == LOCK_EX ? <span class="stringliteral">"LOCK_EX"</span> :</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  (xop == LOCK_UN ? <span class="stringliteral">"LOCK_UN"</span> : <span class="stringliteral">"???"</span>)),</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  (op & LOCK_NB) ? <span class="stringliteral">"|LOCK_NB"</span> : <span class="stringliteral">""</span>);</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  }</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  <span class="keywordflow">return</span> fs->op.flock(path, fi, op);</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  }</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span> }</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span> </div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span> <span class="keywordtype">int</span> fuse_fs_chown(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, uid_t uid,</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  gid_t gid, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span> {</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  <span class="keywordflow">if</span> (fs->op.chown) {</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  <span class="keywordflow">if</span> (fs->debug) {</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  <span class="keywordtype">char</span> buf[10];</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  fprintf(stderr, <span class="stringliteral">"chown[%s] %s %lu %lu\n"</span>,</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  file_info_string(fi, buf, <span class="keyword">sizeof</span>(buf)),</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  path, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) uid, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) gid);</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  }</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  <span class="keywordflow">return</span> fs->op.chown(path, uid, gid, fi);</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  }</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span> }</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span> </div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span> <span class="keywordtype">int</span> fuse_fs_truncate(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, off_t size,</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span> {</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  <span class="keywordflow">if</span> (fs->op.truncate) {</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  <span class="keywordflow">if</span> (fs->debug) {</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  <span class="keywordtype">char</span> buf[10];</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  fprintf(stderr, <span class="stringliteral">"truncate[%s] %llu\n"</span>,</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  file_info_string(fi, buf, <span class="keyword">sizeof</span>(buf)),</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) size);</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  }</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  <span class="keywordflow">return</span> fs->op.truncate(path, size, fi);</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  }</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span> }</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> </div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span> <span class="keywordtype">int</span> fuse_fs_utimens(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  <span class="keyword">const</span> <span class="keyword">struct</span> timespec tv[2], <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span> {</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  <span class="keywordflow">if</span> (fs->op.utimens) {</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  <span class="keywordflow">if</span> (fs->debug) {</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  <span class="keywordtype">char</span> buf[10];</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  fprintf(stderr, <span class="stringliteral">"utimens[%s] %s %li.%09lu %li.%09lu\n"</span>,</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  file_info_string(fi, buf, <span class="keyword">sizeof</span>(buf)),</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>  path, tv[0].tv_sec, tv[0].tv_nsec,</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>  tv[1].tv_sec, tv[1].tv_nsec);</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  }</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>  <span class="keywordflow">return</span> fs->op.utimens(path, tv, fi);</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  }</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span> }</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span> </div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span> <span class="keywordtype">int</span> fuse_fs_access(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">int</span> mask)</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span> {</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  <span class="keywordflow">if</span> (fs->op.access) {</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  fprintf(stderr, <span class="stringliteral">"access %s 0%o\n"</span>, path, mask);</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span> </div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  <span class="keywordflow">return</span> fs->op.access(path, mask);</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  }</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span> }</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span> </div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span> <span class="keywordtype">int</span> fuse_fs_readlink(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">char</span> *buf,</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  <span class="keywordtype">size_t</span> len)</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span> {</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>  <span class="keywordflow">if</span> (fs->op.readlink) {</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  fprintf(stderr, <span class="stringliteral">"readlink %s %lu\n"</span>, path,</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) len);</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span> </div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="keywordflow">return</span> fs->op.readlink(path, buf, len);</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  }</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span> }</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span> </div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span> <span class="keywordtype">int</span> fuse_fs_mknod(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, mode_t mode,</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  dev_t rdev)</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span> {</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="keywordflow">if</span> (fs->op.mknod) {</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  fprintf(stderr, <span class="stringliteral">"mknod %s 0%o 0x%llx umask=0%03o\n"</span>,</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  path, mode, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) rdev,</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()->umask);</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span> </div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  <span class="keywordflow">return</span> fs->op.mknod(path, mode, rdev);</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  }</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span> }</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span> </div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span> <span class="keywordtype">int</span> fuse_fs_mkdir(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, mode_t mode)</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span> {</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  <span class="keywordflow">if</span> (fs->op.mkdir) {</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  fprintf(stderr, <span class="stringliteral">"mkdir %s 0%o umask=0%03o\n"</span>,</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  path, mode, <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()->umask);</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span> </div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  <span class="keywordflow">return</span> fs->op.mkdir(path, mode);</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  }</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span> }</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span> </div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span> <span class="keywordtype">int</span> fuse_fs_setxattr(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *value, <span class="keywordtype">size_t</span> size, <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span> {</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  <span class="keywordflow">if</span> (fs->op.setxattr) {</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  fprintf(stderr, <span class="stringliteral">"setxattr %s %s %lu 0x%x\n"</span>,</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  path, name, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) size, flags);</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span> </div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>  <span class="keywordflow">return</span> fs->op.setxattr(path, name, value, size, flags);</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  }</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span> }</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span> </div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span> <span class="keywordtype">int</span> fuse_fs_getxattr(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="keywordtype">char</span> *value, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span> {</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  <span class="keywordflow">if</span> (fs->op.getxattr) {</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  fprintf(stderr, <span class="stringliteral">"getxattr %s %s %lu\n"</span>,</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  path, name, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) size);</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span> </div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  <span class="keywordflow">return</span> fs->op.getxattr(path, name, value, size);</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  }</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span> }</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span> </div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span> <span class="keywordtype">int</span> fuse_fs_listxattr(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">char</span> *list,</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span> {</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  <span class="keywordflow">if</span> (fs->op.listxattr) {</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  fprintf(stderr, <span class="stringliteral">"listxattr %s %lu\n"</span>,</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  path, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) size);</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span> </div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>  <span class="keywordflow">return</span> fs->op.listxattr(path, list, size);</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  }</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span> }</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span> </div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span> <span class="keywordtype">int</span> fuse_fs_bmap(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">size_t</span> blocksize,</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  uint64_t *<a class="code" href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">idx</a>)</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span> {</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  <span class="keywordflow">if</span> (fs->op.bmap) {</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  fprintf(stderr, <span class="stringliteral">"bmap %s blocksize: %lu index: %llu\n"</span>,</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  path, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) blocksize,</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) *idx);</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span> </div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  <span class="keywordflow">return</span> fs->op.bmap(path, blocksize, idx);</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>  }</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span> }</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span> </div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span> <span class="keywordtype">int</span> fuse_fs_removexattr(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span> {</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  <span class="keywordflow">if</span> (fs->op.removexattr) {</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  fprintf(stderr, <span class="stringliteral">"removexattr %s %s\n"</span>, path, name);</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span> </div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  <span class="keywordflow">return</span> fs->op.removexattr(path, name);</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  }</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span> }</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span> </div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span> <span class="keywordtype">int</span> fuse_fs_ioctl(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">int</span> cmd, <span class="keywordtype">void</span> *arg,</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags, <span class="keywordtype">void</span> *data)</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span> {</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>  <span class="keywordflow">if</span> (fs->op.ioctl) {</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  fprintf(stderr, <span class="stringliteral">"ioctl[%llu] 0x%x flags: 0x%x\n"</span>,</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, cmd, flags);</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span> </div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  <span class="keywordflow">return</span> fs->op.ioctl(path, cmd, arg, fi, flags, data);</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span> }</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span> </div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span> <span class="keywordtype">int</span> fuse_fs_poll(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keyword">struct</span> fuse_pollhandle *ph,</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  <span class="keywordtype">unsigned</span> *reventsp)</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span> {</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  <span class="keywordflow">if</span> (fs->op.poll) {</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span> </div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  fprintf(stderr, <span class="stringliteral">"poll[%llu] ph: %p, events 0x%x\n"</span>,</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, ph,</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  fi-><a class="code" href="structfuse__file__info.html#a51b0d5928ec6112456d2aa50f2c35001">poll_events</a>);</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span> </div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  res = fs->op.poll(path, fi, ph, reventsp);</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span> </div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  <span class="keywordflow">if</span> (fs->debug && !res)</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>  fprintf(stderr, <span class="stringliteral">" poll[%llu] revents: 0x%x\n"</span>,</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>, *reventsp);</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span> </div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span> }</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span> </div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span> <span class="keywordtype">int</span> fuse_fs_fallocate(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">int</span> mode,</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  off_t offset, off_t length, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span> {</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  <span class="keywordflow">if</span> (fs->op.fallocate) {</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>  fprintf(stderr, <span class="stringliteral">"fallocate %s mode %x, offset: %llu, length: %llu\n"</span>,</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  path,</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  mode,</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) offset,</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) length);</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span> </div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  <span class="keywordflow">return</span> fs->op.fallocate(path, mode, offset, length, fi);</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span> }</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span> </div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span> ssize_t fuse_fs_copy_file_range(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path_in,</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi_in, off_t off_in,</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *path_out,</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi_out, off_t off_out,</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>  <span class="keywordtype">size_t</span> len, <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> {</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  <span class="keywordflow">if</span> (fs->op.copy_file_range) {</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  <span class="keywordflow">if</span> (fs->debug)</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  fprintf(stderr, <span class="stringliteral">"copy_file_range from %s:%llu to "</span></div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  <span class="stringliteral">"%s:%llu, length: %llu\n"</span>,</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  path_in,</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off_in,</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  path_out,</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) off_out,</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) len);</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span> </div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  <span class="keywordflow">return</span> fs->op.copy_file_range(path_in, fi_in, off_in, path_out,</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  fi_out, off_out, len, flags);</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span> }</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span> </div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span> <span class="keyword">static</span> <span class="keywordtype">int</span> is_open(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> dir, <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> {</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>  <span class="keywordtype">int</span> isopen = 0;</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>  node = lookup_node(f, dir, name);</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  <span class="keywordflow">if</span> (node && node->open_count > 0)</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>  isopen = 1;</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  <span class="keywordflow">return</span> isopen;</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span> }</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span> </div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span> <span class="keyword">static</span> <span class="keywordtype">char</span> *hidden_name(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> dir, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldname,</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <span class="keywordtype">char</span> *newname, <span class="keywordtype">size_t</span> bufsize)</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span> {</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  <span class="keyword">struct </span>stat buf;</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>  <span class="keyword">struct </span>node *newnode;</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  <span class="keywordtype">char</span> *newpath;</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>  <span class="keywordtype">int</span> failctr = 10;</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span> </div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  node = lookup_node(f, dir, oldname);</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  <span class="keywordflow">if</span> (node == NULL) {</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  }</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>  f->hidectr ++;</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  snprintf(newname, bufsize, <span class="stringliteral">".fuse_hidden%08x%08x"</span>,</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) node->nodeid, f->hidectr);</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>  newnode = lookup_node(f, dir, newname);</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>  } <span class="keywordflow">while</span>(newnode);</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span> </div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  res = try_get_path(f, dir, newname, &newpath, NULL, <span class="keyword">false</span>);</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  <span class="keywordflow">if</span> (res)</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span> </div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  memset(&buf, 0, <span class="keyword">sizeof</span>(buf));</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  res = fuse_fs_getattr(f->fs, newpath, &buf, NULL);</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  <span class="keywordflow">if</span> (res == -ENOENT)</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  free(newpath);</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  newpath = NULL;</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>  } <span class="keywordflow">while</span>(res == 0 && --failctr);</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span> </div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  <span class="keywordflow">return</span> newpath;</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span> }</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span> </div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span> <span class="keyword">static</span> <span class="keywordtype">int</span> hide_node(<span class="keyword">struct</span> fuse *f, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldpath,</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> dir, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldname)</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> {</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>  <span class="keywordtype">char</span> newname[64];</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>  <span class="keywordtype">char</span> *newpath;</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>  <span class="keywordtype">int</span> err = -EBUSY;</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span> </div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>  newpath = hidden_name(f, dir, oldname, newname, <span class="keyword">sizeof</span>(newname));</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>  <span class="keywordflow">if</span> (newpath) {</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>  err = fuse_fs_rename(f->fs, oldpath, newpath, 0);</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  err = rename_node(f, dir, oldname, dir, newname, 1);</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>  free(newpath);</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>  }</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span> }</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span> </div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span> <span class="keyword">static</span> <span class="keywordtype">int</span> mtime_eq(<span class="keyword">const</span> <span class="keyword">struct</span> stat *stbuf, <span class="keyword">const</span> <span class="keyword">struct</span> timespec *ts)</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span> {</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  <span class="keywordflow">return</span> stbuf->st_mtime == ts->tv_sec &&</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>  ST_MTIM_NSEC(stbuf) == ts->tv_nsec;</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span> }</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span> </div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span> <span class="preprocessor">#ifndef CLOCK_MONOTONIC</span></div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span> <span class="preprocessor">#define CLOCK_MONOTONIC CLOCK_REALTIME</span></div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span> </div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span> <span class="keyword">static</span> <span class="keywordtype">void</span> curr_time(<span class="keyword">struct</span> timespec *now)</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span> {</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  <span class="keyword">static</span> clockid_t clockid = CLOCK_MONOTONIC;</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  <span class="keywordtype">int</span> res = clock_gettime(clockid, now);</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>  <span class="keywordflow">if</span> (res == -1 && errno == EINVAL) {</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  clockid = CLOCK_REALTIME;</div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  res = clock_gettime(clockid, now);</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>  }</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  perror(<span class="stringliteral">"fuse: clock_gettime"</span>);</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>  abort();</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  }</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span> }</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span> </div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span> <span class="keyword">static</span> <span class="keywordtype">void</span> update_stat(<span class="keyword">struct</span> node *node, <span class="keyword">const</span> <span class="keyword">struct</span> stat *stbuf)</div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span> {</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>  <span class="keywordflow">if</span> (node->cache_valid && (!mtime_eq(stbuf, &node->mtime) ||</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>  stbuf->st_size != node->size))</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  node->cache_valid = 0;</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  node->mtime.tv_sec = stbuf->st_mtime;</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  node->mtime.tv_nsec = ST_MTIM_NSEC(stbuf);</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  node->size = stbuf->st_size;</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  curr_time(&node->stat_updated);</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span> }</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span> </div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span> <span class="keyword">static</span> <span class="keywordtype">int</span> do_lookup(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> *e)</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span> {</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span> </div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  node = find_node(f, nodeid, name);</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  <span class="keywordflow">if</span> (node == NULL)</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span> </div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  e-><a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a> = node->nodeid;</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  e-><a class="code" href="structfuse__entry__param.html#a4c673ec62c76f7d63d326407beb1b463">generation</a> = node->generation;</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  e-><a class="code" href="structfuse__entry__param.html#a281b39b72e7ec574ba40d7341fd22c1d">entry_timeout</a> = f->conf.entry_timeout;</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  e-><a class="code" href="structfuse__entry__param.html#aa797a9f4152cae506ba479af8bbe2eb7">attr_timeout</a> = f->conf.attr_timeout;</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  <span class="keywordflow">if</span> (f->conf.auto_cache) {</div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  update_stat(node, &e-><a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>);</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  }</div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>  set_stat(f, e-><a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>, &e-><a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>);</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span> }</div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span> </div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span> <span class="keyword">static</span> <span class="keywordtype">int</span> lookup_path(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid,</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> *e, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span> {</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span> </div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  memset(e, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structfuse__entry__param.html">fuse_entry_param</a>));</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  res = fuse_fs_getattr(f->fs, path, &e-><a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>, fi);</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>  <span class="keywordflow">if</span> (res == 0) {</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  res = do_lookup(f, nodeid, name, e);</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  <span class="keywordflow">if</span> (res == 0 && f->conf.debug) {</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  fprintf(stderr, <span class="stringliteral">" NODEID: %llu\n"</span>,</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) e-><a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>);</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>  }</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>  }</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span> }</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span> </div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse_context_i *fuse_get_context_internal(<span class="keywordtype">void</span>)</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span> {</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>  <span class="keywordflow">return</span> (<span class="keyword">struct</span> fuse_context_i *) pthread_getspecific(fuse_context_key);</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span> }</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span> </div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse_context_i *fuse_create_context(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span> {</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>  <span class="keyword">struct </span>fuse_context_i *c = fuse_get_context_internal();</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>  <span class="keywordflow">if</span> (c == NULL) {</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>  c = (<span class="keyword">struct </span>fuse_context_i *)</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_context_i));</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  <span class="keywordflow">if</span> (c == NULL) {</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="comment">/* This is hard to deal with properly, so just</span></div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span> <span class="comment"> abort. If memory is so low that the</span></div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span> <span class="comment"> context cannot be allocated, there's not</span></div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span> <span class="comment"> much hope for the filesystem anyway */</span></div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  fprintf(stderr, <span class="stringliteral">"fuse: failed to allocate thread specific data\n"</span>);</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  abort();</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>  }</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  pthread_setspecific(fuse_context_key, c);</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  memset(c, 0, <span class="keyword">sizeof</span>(*c));</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>  }</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  c->ctx.fuse = f;</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span> </div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <span class="keywordflow">return</span> c;</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span> }</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span> </div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_freecontext(<span class="keywordtype">void</span> *data)</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span> {</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>  free(data);</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span> }</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span> </div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_create_context_key(<span class="keywordtype">void</span>)</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span> {</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <span class="keywordtype">int</span> err = 0;</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  pthread_mutex_lock(&fuse_context_lock);</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  <span class="keywordflow">if</span> (!fuse_context_ref) {</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>  err = pthread_key_create(&fuse_context_key, fuse_freecontext);</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  fprintf(stderr, <span class="stringliteral">"fuse: failed to create thread specific key: %s\n"</span>,</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  strerror(err));</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  pthread_mutex_unlock(&fuse_context_lock);</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  }</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  }</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  fuse_context_ref++;</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  pthread_mutex_unlock(&fuse_context_lock);</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span> }</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span> </div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_delete_context_key(<span class="keywordtype">void</span>)</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span> {</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  pthread_mutex_lock(&fuse_context_lock);</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  fuse_context_ref--;</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  <span class="keywordflow">if</span> (!fuse_context_ref) {</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  free(pthread_getspecific(fuse_context_key));</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  pthread_key_delete(fuse_context_key);</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  }</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  pthread_mutex_unlock(&fuse_context_lock);</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span> }</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span> </div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse *req_fuse_prepare(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span> {</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>  <span class="keyword">struct </span>fuse_context_i *c = fuse_create_context(req_fuse(req));</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structfuse__ctx.html">fuse_ctx</a> *ctx = <a class="code" href="fuse__lowlevel_8h.html#ad1d1963190eb93ae5667d32d2b387ca1">fuse_req_ctx</a>(req);</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  c->req = req;</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  c->ctx.uid = ctx-><a class="code" href="structfuse__ctx.html#abf920c4533df81789fd284aa05ee5771">uid</a>;</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  c->ctx.gid = ctx-><a class="code" href="structfuse__ctx.html#a923348304ee26adb3a43c31a4bac9583">gid</a>;</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  c->ctx.pid = ctx-><a class="code" href="structfuse__ctx.html#a056667c9ce324cb56b833e981aef8b5b">pid</a>;</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  c->ctx.umask = ctx-><a class="code" href="structfuse__ctx.html#aa6932619b51a5bfe4d1362ac4c1d2ce8">umask</a>;</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  <span class="keywordflow">return</span> c->ctx.fuse;</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span> }</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span> </div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> reply_err(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> err)</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span> {</div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  <span class="comment">/* fuse_reply_err() uses non-negated errno values */</span></div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  <a class="code" href="fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, -err);</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span> }</div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span> </div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span> <span class="keyword">static</span> <span class="keywordtype">void</span> reply_entry(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> *e,</div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>  <span class="keywordtype">int</span> err)</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span> {</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  <span class="keyword">struct </span>fuse *f = req_fuse(req);</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__lowlevel_8h.html#a672c45e126cd240f4bcd59bf9b7e3708">fuse_reply_entry</a>(req, e) == -ENOENT) {</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  <span class="comment">/* Skip forget for negative result */</span></div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  <span class="keywordflow">if</span> (e-><a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a> != 0)</div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  forget_node(f, e-><a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>, 1);</div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>  }</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  reply_err(req, err);</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span> }</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span> </div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span> <span class="keywordtype">void</span> fuse_fs_init(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">struct</span> <a class="code" href="structfuse__conn__info.html">fuse_conn_info</a> *conn,</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__config.html">fuse_config</a> *cfg)</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span> {</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  <span class="keywordflow">if</span> (!fs->op.write_buf)</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  conn-><a class="code" href="structfuse__conn__info.html#af45de81548b591f3004353a324e4e04d">want</a> &= ~<a class="code" href="fuse__common_8h.html#a2f8a51bc70841ab691660413836a9a14">FUSE_CAP_SPLICE_READ</a>;</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  <span class="keywordflow">if</span> (!fs->op.lock)</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>  conn-><a class="code" href="structfuse__conn__info.html#af45de81548b591f3004353a324e4e04d">want</a> &= ~<a class="code" href="fuse__common_8h.html#a76f6b481e6a7c519fea9250daef6177a">FUSE_CAP_POSIX_LOCKS</a>;</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  <span class="keywordflow">if</span> (!fs->op.flock)</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  conn-><a class="code" href="structfuse__conn__info.html#af45de81548b591f3004353a324e4e04d">want</a> &= ~<a class="code" href="fuse__common_8h.html#afd06393448dbb60668f5a3bf0006f536">FUSE_CAP_FLOCK_LOCKS</a>;</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  <span class="keywordflow">if</span> (fs->op.init)</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  fs->user_data = fs->op.init(conn, cfg);</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span> }</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span> </div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_init(<span class="keywordtype">void</span> *data, <span class="keyword">struct</span> <a class="code" href="structfuse__conn__info.html">fuse_conn_info</a> *conn)</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span> {</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  <span class="keyword">struct </span>fuse *f = (<span class="keyword">struct </span>fuse *) data;</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span> </div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  fuse_create_context(f);</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  <span class="keywordflow">if</span>(conn-><a class="code" href="structfuse__conn__info.html#a8a1c61f5d7cc14249fb6971165bb958e">capable</a> & <a class="code" href="fuse__common_8h.html#a7686c11aaf80382189927b10b848d8c8">FUSE_CAP_EXPORT_SUPPORT</a>)</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  conn-><a class="code" href="structfuse__conn__info.html#af45de81548b591f3004353a324e4e04d">want</a> |= <a class="code" href="fuse__common_8h.html#a7686c11aaf80382189927b10b848d8c8">FUSE_CAP_EXPORT_SUPPORT</a>;</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  fuse_fs_init(f->fs, conn, &f->conf);</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span> }</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span> </div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span> <span class="keywordtype">void</span> fuse_fs_destroy(<span class="keyword">struct</span> fuse_fs *fs)</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span> {</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  <span class="keywordflow">if</span> (fs->op.destroy)</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  fs->op.destroy(fs->user_data);</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>  <span class="keywordflow">if</span> (fs->m)</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  fuse_put_module(fs->m);</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  free(fs);</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span> }</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span> </div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_destroy(<span class="keywordtype">void</span> *data)</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span> {</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <span class="keyword">struct </span>fuse *f = (<span class="keyword">struct </span>fuse *) data;</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span> </div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  fuse_create_context(f);</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>  fuse_fs_destroy(f->fs);</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>  f->fs = NULL;</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span> }</div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span> </div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_lookup(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span> {</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e;</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  <span class="keyword">struct </span>node *dot = NULL;</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span> </div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  <span class="keywordflow">if</span> (name[0] == <span class="charliteral">'.'</span>) {</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  <span class="keywordtype">int</span> len = strlen(name);</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span> </div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  <span class="keywordflow">if</span> (len == 1 || (name[1] == <span class="charliteral">'.'</span> && len == 2)) {</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  <span class="keywordflow">if</span> (len == 1) {</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  <span class="keywordflow">if</span> (f->conf.debug)</div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  fprintf(stderr, <span class="stringliteral">"LOOKUP-DOT\n"</span>);</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  dot = get_node_nocheck(f, parent);</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  <span class="keywordflow">if</span> (dot == NULL) {</div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  reply_entry(req, &e, -ESTALE);</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  }</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  dot->refctr++;</div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  <span class="keywordflow">if</span> (f->conf.debug)</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  fprintf(stderr, <span class="stringliteral">"LOOKUP-DOTDOT\n"</span>);</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  parent = get_node(f, parent)->parent->nodeid;</div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  }</div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  name = NULL;</div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  }</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  }</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span> </div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  err = get_path_name(f, parent, name, &path);</div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  <span class="keywordflow">if</span> (f->conf.debug)</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  fprintf(stderr, <span class="stringliteral">"LOOKUP %s\n"</span>, path);</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  err = lookup_path(f, parent, name, path, &e, NULL);</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  <span class="keywordflow">if</span> (err == -ENOENT && f->conf.negative_timeout != 0.0) {</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  e.<a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a> = 0;</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  e.<a class="code" href="structfuse__entry__param.html#a281b39b72e7ec574ba40d7341fd22c1d">entry_timeout</a> = f->conf.negative_timeout;</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  err = 0;</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  }</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  free_path(f, parent, path);</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  }</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="keywordflow">if</span> (dot) {</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  unref_node(f, dot);</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  }</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  reply_entry(req, &e, err);</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span> }</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span> </div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_forget(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, uint64_t nlookup)</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span> {</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  <span class="keywordflow">if</span> (f->conf.debug)</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  fprintf(stderr, <span class="stringliteral">"FORGET %llu/%llu\n"</span>, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>)ino,</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) nlookup);</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  forget_node(f, ino, nlookup);</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span> }</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span> </div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_forget(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, uint64_t nlookup)</div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span> {</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  do_forget(req_fuse(req), ino, nlookup);</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  <a class="code" href="fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(req);</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span> }</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span> </div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_forget_multi(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">size_t</span> count,</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  <span class="keyword">struct</span> fuse_forget_data *forgets)</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span> {</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="keyword">struct </span>fuse *f = req_fuse(req);</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  <span class="keywordtype">size_t</span> i;</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span> </div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  <span class="keywordflow">for</span> (i = 0; i < count; i++)</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  do_forget(f, forgets[i].ino, forgets[i].nlookup);</div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span> </div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  <a class="code" href="fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(req);</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span> }</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span> </div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span> </div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_getattr(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span> {</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  <span class="keyword">struct </span>stat buf;</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span> </div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  memset(&buf, 0, <span class="keyword">sizeof</span>(buf));</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span> </div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>  <span class="keywordflow">if</span> (fi != NULL)</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>  err = fuse_fs_getattr(f->fs, path, &buf, fi);</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>  free_path(f, ino, path);</div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>  }</div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span> </div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>  node = get_node(f, ino);</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>  <span class="keywordflow">if</span> (node->is_hidden && buf.st_nlink > 0)</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>  buf.st_nlink--;</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>  <span class="keywordflow">if</span> (f->conf.auto_cache)</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>  update_stat(node, &buf);</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>  set_stat(f, ino, &buf);</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>  <a class="code" href="fuse__lowlevel_8h.html#ad28378dc569019c32acdb4995d70be18">fuse_reply_attr</a>(req, &buf, f->conf.attr_timeout);</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>  reply_err(req, err);</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span> }</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span> </div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span> <span class="keywordtype">int</span> fuse_fs_chmod(<span class="keyword">struct</span> fuse_fs *fs, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, mode_t mode,</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span> {</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>  <a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>()-><a class="code" href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">private_data</a> = fs->user_data;</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  <span class="keywordflow">if</span> (fs->op.chmod) {</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  <span class="keywordflow">if</span> (fs->debug) {</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  <span class="keywordtype">char</span> buf[10];</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>  fprintf(stderr, <span class="stringliteral">"chmod[%s] %s %llo\n"</span>,</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>  file_info_string(fi, buf, <span class="keyword">sizeof</span>(buf)),</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>  path, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) mode);</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>  }</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>  <span class="keywordflow">return</span> fs->op.chmod(path, mode, fi);</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>  }</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span> }</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span> </div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_setattr(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keyword">struct</span> stat *attr,</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>  <span class="keywordtype">int</span> valid, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span> {</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  <span class="keyword">struct </span>stat buf;</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span> </div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  memset(&buf, 0, <span class="keyword">sizeof</span>(buf));</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>  <span class="keywordflow">if</span> (fi != NULL)</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>  err = 0;</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  <span class="keywordflow">if</span> (!err && (valid & FUSE_SET_ATTR_MODE))</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  err = fuse_fs_chmod(f->fs, path, attr->st_mode, fi);</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  <span class="keywordflow">if</span> (!err && (valid & (FUSE_SET_ATTR_UID | FUSE_SET_ATTR_GID))) {</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  uid_t uid = (valid & FUSE_SET_ATTR_UID) ?</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  attr->st_uid : (uid_t) -1;</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  gid_t gid = (valid & FUSE_SET_ATTR_GID) ?</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  attr->st_gid : (gid_t) -1;</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  err = fuse_fs_chown(f->fs, path, uid, gid, fi);</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>  }</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>  <span class="keywordflow">if</span> (!err && (valid & FUSE_SET_ATTR_SIZE)) {</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>  err = fuse_fs_truncate(f->fs, path,</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>  attr->st_size, fi);</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>  }</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span> <span class="preprocessor">#ifdef HAVE_UTIMENSAT</span></div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  <span class="keywordflow">if</span> (!err &&</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>  (valid & (FUSE_SET_ATTR_ATIME | FUSE_SET_ATTR_MTIME))) {</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>  <span class="keyword">struct </span>timespec tv[2];</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span> </div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  tv[0].tv_sec = 0;</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  tv[1].tv_sec = 0;</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  tv[0].tv_nsec = UTIME_OMIT;</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>  tv[1].tv_nsec = UTIME_OMIT;</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span> </div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>  <span class="keywordflow">if</span> (valid & FUSE_SET_ATTR_ATIME_NOW)</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  tv[0].tv_nsec = UTIME_NOW;</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (valid & FUSE_SET_ATTR_ATIME)</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  tv[0] = attr->st_atim;</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span> </div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>  <span class="keywordflow">if</span> (valid & FUSE_SET_ATTR_MTIME_NOW)</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>  tv[1].tv_nsec = UTIME_NOW;</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (valid & FUSE_SET_ATTR_MTIME)</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>  tv[1] = attr->st_mtim;</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span> </div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  err = fuse_fs_utimens(f->fs, path, tv, fi);</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>  <span class="keywordflow">if</span> (!err &&</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>  (valid & (FUSE_SET_ATTR_ATIME | FUSE_SET_ATTR_MTIME)) ==</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>  (FUSE_SET_ATTR_ATIME | FUSE_SET_ATTR_MTIME)) {</div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>  <span class="keyword">struct </span>timespec tv[2];</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>  tv[0].tv_sec = attr->st_atime;</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>  tv[0].tv_nsec = ST_ATIM_NSEC(attr);</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>  tv[1].tv_sec = attr->st_mtime;</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>  tv[1].tv_nsec = ST_MTIM_NSEC(attr);</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>  err = fuse_fs_utimens(f->fs, path, tv, fi);</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>  }</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>  err = fuse_fs_getattr(f->fs, path, &buf, fi);</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>  }</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>  free_path(f, ino, path);</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>  }</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  <span class="keywordflow">if</span> (f->conf.auto_cache) {</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>  update_stat(get_node(f, ino), &buf);</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>  }</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>  set_stat(f, ino, &buf);</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>  <a class="code" href="fuse__lowlevel_8h.html#ad28378dc569019c32acdb4995d70be18">fuse_reply_attr</a>(req, &buf, f->conf.attr_timeout);</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>  reply_err(req, err);</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span> }</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span> </div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_access(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">int</span> mask)</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span> {</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span> </div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span> </div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  err = fuse_fs_access(f->fs, path, mask);</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  free_path(f, ino, path);</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>  }</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>  reply_err(req, err);</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span> }</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span> </div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_readlink(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino)</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span> {</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>  <span class="keywordtype">char</span> linkname[PATH_MAX + 1];</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span> </div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>  err = fuse_fs_readlink(f->fs, path, linkname, <span class="keyword">sizeof</span>(linkname));</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  free_path(f, ino, path);</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  }</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>  linkname[PATH_MAX] = <span class="charliteral">'\0'</span>;</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>  <a class="code" href="fuse__lowlevel_8h.html#a5a5872d7f73f0bd593e00788a4c7bbb7">fuse_reply_readlink</a>(req, linkname);</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>  reply_err(req, err);</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span> }</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span> </div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_mknod(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>  mode_t mode, dev_t rdev)</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span> {</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e;</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span> </div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>  err = get_path_name(f, parent, name, &path);</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span> </div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>  err = -ENOSYS;</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>  <span class="keywordflow">if</span> (S_ISREG(mode)) {</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi;</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span> </div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = O_CREAT | O_EXCL | O_WRONLY;</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>  err = fuse_fs_create(f->fs, path, mode, &fi);</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>  err = lookup_path(f, parent, name, path, &e,</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>  &fi);</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>  fuse_fs_release(f->fs, path, &fi);</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>  }</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>  }</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>  <span class="keywordflow">if</span> (err == -ENOSYS) {</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>  err = fuse_fs_mknod(f->fs, path, mode, rdev);</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>  err = lookup_path(f, parent, name, path, &e,</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>  NULL);</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  }</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>  free_path(f, parent, path);</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  }</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>  reply_entry(req, &e, err);</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span> }</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span> </div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_mkdir(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>  mode_t mode)</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span> {</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e;</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span> </div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>  err = get_path_name(f, parent, name, &path);</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span> </div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>  err = fuse_fs_mkdir(f->fs, path, mode);</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>  err = lookup_path(f, parent, name, path, &e, NULL);</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>  free_path(f, parent, path);</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>  }</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>  reply_entry(req, &e, err);</div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span> }</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span> </div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_unlink(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span> {</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>  <span class="keyword">struct </span>node *wnode;</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span> </div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>  err = get_path_wrlock(f, parent, name, &path, &wnode);</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span> </div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>  <span class="keywordflow">if</span> (!f->conf.hard_remove && is_open(f, parent, name)) {</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>  err = hide_node(f, path, parent, name);</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>  err = fuse_fs_unlink(f->fs, path);</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>  remove_node(f, parent, name);</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>  }</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>  free_path_wrlock(f, parent, wnode, path);</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>  }</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>  reply_err(req, err);</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span> }</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span> </div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_rmdir(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent, <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span> {</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>  <span class="keyword">struct </span>node *wnode;</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span> </div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>  err = get_path_wrlock(f, parent, name, &path, &wnode);</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span> </div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>  err = fuse_fs_rmdir(f->fs, path);</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  remove_node(f, parent, name);</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>  free_path_wrlock(f, parent, wnode, path);</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>  }</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>  reply_err(req, err);</div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span> }</div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span> </div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_symlink(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keywordtype">char</span> *linkname,</div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent, <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span> {</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e;</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span> </div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  err = get_path_name(f, parent, name, &path);</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span> </div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>  err = fuse_fs_symlink(f->fs, linkname, path);</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>  err = lookup_path(f, parent, name, path, &e, NULL);</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>  free_path(f, parent, path);</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>  }</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>  reply_entry(req, &e, err);</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span> }</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span> </div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_rename(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> olddir,</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *oldname, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> newdir,</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *newname, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span> {</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>  <span class="keywordtype">char</span> *oldpath;</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>  <span class="keywordtype">char</span> *newpath;</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>  <span class="keyword">struct </span>node *wnode1;</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>  <span class="keyword">struct </span>node *wnode2;</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span> </div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>  err = get_path2(f, olddir, oldname, newdir, newname,</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>  &oldpath, &newpath, &wnode1, &wnode2);</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>  err = 0;</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>  <span class="keywordflow">if</span> (!f->conf.hard_remove && !(flags & RENAME_EXCHANGE) &&</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>  is_open(f, newdir, newname))</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>  err = hide_node(f, newpath, newdir, newname);</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>  err = fuse_fs_rename(f->fs, oldpath, newpath, flags);</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>  <span class="keywordflow">if</span> (flags & RENAME_EXCHANGE) {</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>  err = exchange_node(f, olddir, oldname,</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>  newdir, newname);</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>  err = rename_node(f, olddir, oldname,</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>  newdir, newname, 0);</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>  }</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  }</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  }</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>  free_path2(f, olddir, newdir, wnode1, wnode2, oldpath, newpath);</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>  }</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>  reply_err(req, err);</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span> }</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span> </div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_link(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> newparent,</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *newname)</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span> {</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e;</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>  <span class="keywordtype">char</span> *oldpath;</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>  <span class="keywordtype">char</span> *newpath;</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span> </div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>  err = get_path2(f, ino, NULL, newparent, newname,</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>  &oldpath, &newpath, NULL, NULL);</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span> </div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>  err = fuse_fs_link(f->fs, oldpath, newpath);</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>  err = lookup_path(f, newparent, newname, newpath,</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>  &e, NULL);</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>  free_path2(f, ino, newparent, NULL, NULL, oldpath, newpath);</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  }</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  reply_entry(req, &e, err);</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span> }</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span> </div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_do_release(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span> {</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>  <span class="keywordtype">int</span> unlink_hidden = 0;</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span> </div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>  fuse_fs_release(f->fs, path, fi);</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span> </div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>  node = get_node(f, ino);</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>  assert(node->open_count > 0);</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>  --node->open_count;</div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>  <span class="keywordflow">if</span> (node->is_hidden && !node->open_count) {</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>  unlink_hidden = 1;</div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>  node->is_hidden = 0;</div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>  }</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span> </div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>  <span class="keywordflow">if</span>(unlink_hidden) {</div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>  <span class="keywordflow">if</span> (path) {</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>  fuse_fs_unlink(f->fs, path);</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (f->conf.nullpath_ok) {</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>  <span class="keywordtype">char</span> *unlinkpath;</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span> </div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>  <span class="keywordflow">if</span> (get_path(f, ino, &unlinkpath) == 0)</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>  fuse_fs_unlink(f->fs, unlinkpath);</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span> </div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>  free_path(f, ino, unlinkpath);</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>  }</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>  }</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span> }</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span> </div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_create(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name, mode_t mode,</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span> {</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e;</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span> </div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>  err = get_path_name(f, parent, name, &path);</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>  err = fuse_fs_create(f->fs, path, mode, fi);</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>  err = lookup_path(f, parent, name, path, &e, fi);</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>  <span class="keywordflow">if</span> (err)</div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>  fuse_fs_release(f->fs, path, fi);</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!S_ISREG(e.<a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>.st_mode)) {</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>  err = -EIO;</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>  fuse_fs_release(f->fs, path, fi);</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>  forget_node(f, e.<a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>, 1);</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>  <span class="keywordflow">if</span> (f->conf.direct_io)</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>  fi-><a class="code" href="structfuse__file__info.html#a03b59a10e62963d9affa34ad78bd144a">direct_io</a> = 1;</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>  <span class="keywordflow">if</span> (f->conf.kernel_cache)</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>  fi-><a class="code" href="structfuse__file__info.html#a23a64eaecbf83f99aba8ee79e6de2780">keep_cache</a> = 1;</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span> </div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>  }</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>  }</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>  }</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>  get_node(f, e.<a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>)->open_count++;</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__lowlevel_8h.html#abea78d22349198f8370d7cb91fbf05ed">fuse_reply_create</a>(req, &e, fi) == -ENOENT) {</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>  <span class="comment">/* The open syscall was interrupted, so it</span></div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span> <span class="comment"> must be cancelled */</span></div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>  fuse_do_release(f, e.<a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>, path, fi);</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>  forget_node(f, e.<a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>, 1);</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>  }</div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>  reply_err(req, err);</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>  }</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span> </div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>  free_path(f, parent, path);</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span> }</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span> </div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span> <span class="keyword">static</span> <span class="keywordtype">double</span> diff_timespec(<span class="keyword">const</span> <span class="keyword">struct</span> timespec *t1,</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>  <span class="keyword">const</span> <span class="keyword">struct</span> timespec *t2)</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span> {</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>  <span class="keywordflow">return</span> (t1->tv_sec - t2->tv_sec) +</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>  ((double) t1->tv_nsec - (<span class="keywordtype">double</span>) t2->tv_nsec) / 1000000000.0;</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span> }</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span> </div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span> <span class="keyword">static</span> <span class="keywordtype">void</span> open_auto_cache(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span> {</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span> </div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>  node = get_node(f, ino);</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>  <span class="keywordflow">if</span> (node->cache_valid) {</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>  <span class="keyword">struct </span>timespec now;</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span> </div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>  curr_time(&now);</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>  <span class="keywordflow">if</span> (diff_timespec(&now, &node->stat_updated) ></div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>  f->conf.ac_attr_timeout) {</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>  <span class="keyword">struct </span>stat stbuf;</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>  err = fuse_fs_getattr(f->fs, path, &stbuf, fi);</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>  update_stat(node, &stbuf);</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>  node->cache_valid = 0;</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>  }</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>  }</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>  <span class="keywordflow">if</span> (node->cache_valid)</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>  fi-><a class="code" href="structfuse__file__info.html#a23a64eaecbf83f99aba8ee79e6de2780">keep_cache</a> = 1;</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span> </div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>  node->cache_valid = 1;</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span> }</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span> </div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_open(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span> {</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span> </div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>  err = fuse_fs_open(f->fs, path, fi);</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>  <span class="keywordflow">if</span> (f->conf.direct_io)</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>  fi-><a class="code" href="structfuse__file__info.html#a03b59a10e62963d9affa34ad78bd144a">direct_io</a> = 1;</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>  <span class="keywordflow">if</span> (f->conf.kernel_cache)</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>  fi-><a class="code" href="structfuse__file__info.html#a23a64eaecbf83f99aba8ee79e6de2780">keep_cache</a> = 1;</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span> </div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>  <span class="keywordflow">if</span> (f->conf.auto_cache)</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>  open_auto_cache(f, ino, path, fi);</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>  }</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>  }</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>  get_node(f, ino)->open_count++;</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__lowlevel_8h.html#a170f8c6b953d70928e83bcecee43bfdc">fuse_reply_open</a>(req, fi) == -ENOENT) {</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>  <span class="comment">/* The open syscall was interrupted, so it</span></div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span> <span class="comment"> must be cancelled */</span></div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>  fuse_do_release(f, ino, path, fi);</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>  }</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>  reply_err(req, err);</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span> </div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>  free_path(f, ino, path);</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span> }</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span> </div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_read(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">size_t</span> size,</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>  off_t off, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span> {</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf = NULL;</div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span> </div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>  res = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>  <span class="keywordflow">if</span> (res == 0) {</div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span> </div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>  res = fuse_fs_read_buf(f->fs, path, &buf, size, off, fi);</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>  free_path(f, ino, path);</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>  }</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span> </div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>  <span class="keywordflow">if</span> (res == 0)</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>  <a class="code" href="fuse__lowlevel_8h.html#a1242694fe0fb6e253a88b57795987302">fuse_reply_data</a>(req, buf, <a class="code" href="fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18af239e556066a5d73b3ff542216b157b9">FUSE_BUF_SPLICE_MOVE</a>);</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>  reply_err(req, res);</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span> </div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>  fuse_free_buf(buf);</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span> }</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span> </div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_write_buf(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf, off_t off,</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span> {</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span> </div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>  res = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>  <span class="keywordflow">if</span> (res == 0) {</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span> </div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>  res = fuse_fs_write_buf(f->fs, path, buf, off, fi);</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>  free_path(f, ino, path);</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>  }</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span> </div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>  <span class="keywordflow">if</span> (res >= 0)</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>  <a class="code" href="fuse__lowlevel_8h.html#aa3cfa73f61d6ef461ab5a3fbf859eb97">fuse_reply_write</a>(req, res);</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>  reply_err(req, res);</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span> }</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span> </div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_fsync(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">int</span> datasync,</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span> {</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span> </div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span> </div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>  err = fuse_fs_fsync(f->fs, path, datasync, fi);</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>  free_path(f, ino, path);</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>  }</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>  reply_err(req, err);</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span> }</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span> </div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse_dh *get_dirhandle(<span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi,</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span> {</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>  <span class="keyword">struct </span>fuse_dh *dh = (<span class="keyword">struct </span>fuse_dh *) (uintptr_t) llfi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>;</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>  memset(fi, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a>));</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>  fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = dh->fh;</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>  <span class="keywordflow">return</span> dh;</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span> }</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span> </div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_opendir(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi)</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span> {</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>  <span class="keyword">struct </span>fuse_dh *dh;</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi;</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span> </div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>  dh = (<span class="keyword">struct </span>fuse_dh *) malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_dh));</div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>  <span class="keywordflow">if</span> (dh == NULL) {</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>  reply_err(req, -ENOMEM);</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>  }</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>  memset(dh, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_dh));</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>  dh->fuse = f;</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>  dh->contents = NULL;</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>  dh->first = NULL;</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>  dh->len = 0;</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>  dh->filled = 0;</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>  dh->nodeid = ino;</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>  fuse_mutex_init(&dh->lock);</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span> </div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>  llfi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = (uintptr_t) dh;</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span> </div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = llfi-><a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a>;</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span> </div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>  err = fuse_fs_opendir(f->fs, path, &fi);</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>  dh->fh = fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>;</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>  }</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__lowlevel_8h.html#a170f8c6b953d70928e83bcecee43bfdc">fuse_reply_open</a>(req, llfi) == -ENOENT) {</div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>  <span class="comment">/* The opendir syscall was interrupted, so it</span></div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span> <span class="comment"> must be cancelled */</span></div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>  fuse_fs_releasedir(f->fs, path, &fi);</div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>  pthread_mutex_destroy(&dh->lock);</div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>  free(dh);</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>  }</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>  reply_err(req, err);</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>  pthread_mutex_destroy(&dh->lock);</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>  free(dh);</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>  }</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>  free_path(f, ino, path);</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span> }</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span> </div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span> <span class="keyword">static</span> <span class="keywordtype">int</span> extend_contents(<span class="keyword">struct</span> fuse_dh *dh, <span class="keywordtype">unsigned</span> minsize)</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span> {</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>  <span class="keywordflow">if</span> (minsize > dh->size) {</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>  <span class="keywordtype">char</span> *newptr;</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>  <span class="keywordtype">unsigned</span> newsize = dh->size;</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>  <span class="keywordflow">if</span> (!newsize)</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>  newsize = 1024;</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>  <span class="keywordflow">while</span> (newsize < minsize) {</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>  <span class="keywordflow">if</span> (newsize >= 0x80000000)</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>  newsize = 0xffffffff;</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>  newsize *= 2;</div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>  }</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span> </div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>  newptr = (<span class="keywordtype">char</span> *) realloc(dh->contents, newsize);</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>  <span class="keywordflow">if</span> (!newptr) {</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>  dh->error = -ENOMEM;</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>  }</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>  dh->contents = newptr;</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>  dh->size = newsize;</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>  }</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span> }</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span> </div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_add_direntry_to_dh(<span class="keyword">struct</span> fuse_dh *dh, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>  <span class="keyword">struct</span> stat *st)</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span> {</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>  <span class="keyword">struct </span>fuse_direntry *de;</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span> </div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>  de = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_direntry));</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>  <span class="keywordflow">if</span> (!de) {</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>  dh->error = -ENOMEM;</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>  }</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>  de->name = strdup(name);</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>  <span class="keywordflow">if</span> (!de->name) {</div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>  dh->error = -ENOMEM;</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>  free(de);</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>  }</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>  de->stat = *st;</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>  de->next = NULL;</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span> </div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>  *dh->last = de;</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>  dh->last = &de->next;</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span> </div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span> }</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span> </div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span> <span class="keyword">static</span> <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> lookup_nodeid(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span> {</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> res = FUSE_UNKNOWN_INO;</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span> </div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>  node = lookup_node(f, parent, name);</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>  <span class="keywordflow">if</span> (node)</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>  res = node->nodeid;</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span> </div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span> }</div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span> </div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fill_dir(<span class="keywordtype">void</span> *dh_, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> <span class="keyword">struct</span> stat *statp,</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>  off_t off, <span class="keyword">enum</span> <a class="code" href="fuse_8h.html#af1d0194d186240ef6aaf6e9bf8568568">fuse_fill_dir_flags</a> flags)</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span> {</div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>  <span class="keyword">struct </span>fuse_dh *dh = (<span class="keyword">struct </span>fuse_dh *) dh_;</div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>  <span class="keyword">struct </span>stat stbuf;</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span> </div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>  <span class="keywordflow">if</span> ((flags & ~<a class="code" href="fuse_8h.html#af1d0194d186240ef6aaf6e9bf8568568a3f50d11935fe96eb4df6ff0844c4e153">FUSE_FILL_DIR_PLUS</a>) != 0) {</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>  dh->error = -EIO;</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>  }</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span> </div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>  <span class="keywordflow">if</span> (statp)</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>  stbuf = *statp;</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>  memset(&stbuf, 0, <span class="keyword">sizeof</span>(stbuf));</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>  stbuf.st_ino = FUSE_UNKNOWN_INO;</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>  }</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span> </div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>  <span class="keywordflow">if</span> (!dh->fuse->conf.use_ino) {</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>  stbuf.st_ino = FUSE_UNKNOWN_INO;</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>  <span class="keywordflow">if</span> (dh->fuse->conf.readdir_ino) {</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>  stbuf.st_ino = (ino_t)</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>  lookup_nodeid(dh->fuse, dh->nodeid, name);</div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>  }</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>  }</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span> </div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>  <span class="keywordflow">if</span> (off) {</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>  <span class="keywordtype">size_t</span> newlen;</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span> </div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  <span class="keywordflow">if</span> (dh->filled) {</div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>  dh->error = -EIO;</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>  }</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span> </div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>  <span class="keywordflow">if</span> (dh->first) {</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>  dh->error = -EIO;</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>  }</div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span> </div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>  <span class="keywordflow">if</span> (extend_contents(dh, dh->needlen) == -1)</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span> </div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>  newlen = dh->len +</div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>  <a class="code" href="fuse__lowlevel_8h.html#ad1957bcc8ece8c90f16c42c4daf3053f">fuse_add_direntry</a>(dh->req, dh->contents + dh->len,</div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>  dh->needlen - dh->len, name,</div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>  &stbuf, off);</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>  <span class="keywordflow">if</span> (newlen > dh->needlen)</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span> </div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>  dh->len = newlen;</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>  dh->filled = 1;</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span> </div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>  <span class="keywordflow">if</span> (fuse_add_direntry_to_dh(dh, name, &stbuf) == -1)</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>  }</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span> }</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span> </div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span> <span class="keyword">static</span> <span class="keywordtype">int</span> is_dot_or_dotdot(<span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span> {</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>  <span class="keywordflow">return</span> name[0] == <span class="charliteral">'.'</span> && (name[1] == <span class="charliteral">'\0'</span> ||</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>  (name[1] == <span class="charliteral">'.'</span> && name[2] == <span class="charliteral">'\0'</span>));</div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span> }</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span> </div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fill_dir_plus(<span class="keywordtype">void</span> *dh_, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> <span class="keyword">struct</span> stat *statp,</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>  off_t off, <span class="keyword">enum</span> <a class="code" href="fuse_8h.html#af1d0194d186240ef6aaf6e9bf8568568">fuse_fill_dir_flags</a> flags)</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span> {</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>  <span class="keyword">struct </span>fuse_dh *dh = (<span class="keyword">struct </span>fuse_dh *) dh_;</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e = {</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>  <span class="comment">/* ino=0 tells the kernel to ignore readdirplus stat info */</span></div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>  .<a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a> = 0,</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>  };</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>  <span class="keyword">struct </span>fuse *f = dh->fuse;</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span> </div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>  <span class="keywordflow">if</span> ((flags & ~<a class="code" href="fuse_8h.html#af1d0194d186240ef6aaf6e9bf8568568a3f50d11935fe96eb4df6ff0844c4e153">FUSE_FILL_DIR_PLUS</a>) != 0) {</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>  dh->error = -EIO;</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>  }</div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span> </div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>  <span class="keywordflow">if</span> (off && statp && (flags & <a class="code" href="fuse_8h.html#af1d0194d186240ef6aaf6e9bf8568568a3f50d11935fe96eb4df6ff0844c4e153">FUSE_FILL_DIR_PLUS</a>)) {</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>  e.<a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a> = *statp;</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span> </div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>  <span class="keywordflow">if</span> (!is_dot_or_dotdot(name)) {</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>  res = do_lookup(f, dh->nodeid, name, &e);</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>  <span class="keywordflow">if</span> (res) {</div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>  dh->error = res;</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>  }</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>  }</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>  e.<a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>.st_ino = FUSE_UNKNOWN_INO;</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>  <span class="keywordflow">if</span> (!f->conf.use_ino && f->conf.readdir_ino) {</div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>  e.<a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>.st_ino = (ino_t)</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>  lookup_nodeid(f, dh->nodeid, name);</div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>  }</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>  }</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span> </div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>  <span class="keywordflow">if</span> (off) {</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>  <span class="keywordtype">size_t</span> newlen;</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span> </div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>  <span class="keywordflow">if</span> (dh->filled) {</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>  dh->error = -EIO;</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>  }</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span> </div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>  <span class="keywordflow">if</span> (dh->first) {</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>  dh->error = -EIO;</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>  }</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>  <span class="keywordflow">if</span> (extend_contents(dh, dh->needlen) == -1)</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span> </div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>  newlen = dh->len +</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>  <a class="code" href="fuse__lowlevel_8h.html#a34f3f1beebacab5f717d95baf832a8a5">fuse_add_direntry_plus</a>(dh->req, dh->contents + dh->len,</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>  dh->needlen - dh->len, name,</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>  &e, off);</div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>  <span class="keywordflow">if</span> (newlen > dh->needlen)</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>  dh->len = newlen;</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>  dh->filled = 1;</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span> </div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>  <span class="keywordflow">if</span> (fuse_add_direntry_to_dh(dh, name, &e.<a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>) == -1)</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>  }</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span> </div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span> }</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span> </div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span> <span class="keyword">static</span> <span class="keywordtype">void</span> free_direntries(<span class="keyword">struct</span> fuse_direntry *de)</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span> {</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>  <span class="keywordflow">while</span> (de) {</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>  <span class="keyword">struct </span>fuse_direntry *next = de->next;</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>  free(de->name);</div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>  free(de);</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  de = next;</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  }</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span> }</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span> </div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span> <span class="keyword">static</span> <span class="keywordtype">int</span> readdir_fill(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>  <span class="keywordtype">size_t</span> size, off_t off, <span class="keyword">struct</span> fuse_dh *dh,</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi,</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>  <span class="keyword">enum</span> <a class="code" href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074">fuse_readdir_flags</a> flags)</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span> {</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span> </div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>  <span class="keywordflow">if</span> (f->fs->op.readdir)</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>  <a class="code" href="fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660">fuse_fill_dir_t</a> filler = fill_dir;</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span> </div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>  <span class="keywordflow">if</span> (flags & <a class="code" href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074ad62ab7c23f966a76282921e9187ca441">FUSE_READDIR_PLUS</a>)</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>  filler = fill_dir_plus;</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span> </div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>  free_direntries(dh->first);</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>  dh->first = NULL;</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>  dh->last = &dh->first;</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>  dh->len = 0;</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>  dh->error = 0;</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>  dh->needlen = size;</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>  dh->filled = 0;</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>  dh->req = req;</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>  err = fuse_fs_readdir(f->fs, path, dh, filler, off, fi, flags);</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>  dh->req = NULL;</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>  err = dh->error;</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>  <span class="keywordflow">if</span> (err)</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>  dh->filled = 0;</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>  free_path(f, ino, path);</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>  }</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span> }</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span> </div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span> <span class="keyword">static</span> <span class="keywordtype">int</span> readdir_fill_from_list(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">struct</span> fuse_dh *dh,</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>  off_t off, <span class="keyword">enum</span> <a class="code" href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074">fuse_readdir_flags</a> flags)</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span> {</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>  off_t pos;</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>  <span class="keyword">struct </span>fuse_direntry *de = dh->first;</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span> </div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>  dh->len = 0;</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span> </div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>  <span class="keywordflow">if</span> (extend_contents(dh, dh->needlen) == -1)</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>  <span class="keywordflow">return</span> dh->error;</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span> </div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>  <span class="keywordflow">for</span> (pos = 0; pos < off; pos++) {</div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>  <span class="keywordflow">if</span> (!de)</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span> </div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>  de = de->next;</div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>  }</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>  <span class="keywordflow">while</span> (de) {</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>  <span class="keywordtype">char</span> *p = dh->contents + dh->len;</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>  <span class="keywordtype">unsigned</span> rem = dh->needlen - dh->len;</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>  <span class="keywordtype">unsigned</span> thislen;</div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>  <span class="keywordtype">unsigned</span> newlen;</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>  pos++;</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span> </div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>  <span class="keywordflow">if</span> (flags & FUSE_READDIR_PLUS) {</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>  <span class="keyword">struct </span><a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> e = {</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>  .<a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a> = 0,</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>  .attr = de->stat,</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>  };</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>  thislen = <a class="code" href="fuse__lowlevel_8h.html#a34f3f1beebacab5f717d95baf832a8a5">fuse_add_direntry_plus</a>(req, p, rem,</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>  de->name, &e, pos);</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>  thislen = <a class="code" href="fuse__lowlevel_8h.html#ad1957bcc8ece8c90f16c42c4daf3053f">fuse_add_direntry</a>(req, p, rem,</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>  de->name, &de->stat, pos);</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>  }</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>  newlen = dh->len + thislen;</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>  <span class="keywordflow">if</span> (newlen > dh->needlen)</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>  dh->len = newlen;</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>  de = de->next;</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>  }</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span> }</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span> </div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_readdir_common(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">size_t</span> size,</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>  off_t off, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi,</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>  <span class="keyword">enum</span> <a class="code" href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074">fuse_readdir_flags</a> flags)</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span> {</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi;</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>  <span class="keyword">struct </span>fuse_dh *dh = get_dirhandle(llfi, &fi);</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span> </div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>  pthread_mutex_lock(&dh->lock);</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>  <span class="comment">/* According to SUS, directory contents need to be refreshed on</span></div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span> <span class="comment"> rewinddir() */</span></div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>  <span class="keywordflow">if</span> (!off)</div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>  dh->filled = 0;</div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span> </div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>  <span class="keywordflow">if</span> (!dh->filled) {</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>  err = readdir_fill(f, req, ino, size, off, dh, &fi, flags);</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>  reply_err(req, err);</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>  }</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>  }</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>  <span class="keywordflow">if</span> (dh->filled) {</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>  dh->needlen = size;</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>  err = readdir_fill_from_list(req, dh, off, flags);</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>  reply_err(req, err);</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>  }</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>  }</div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>  <a class="code" href="fuse__lowlevel_8h.html#a300a88b63ab7c8ca92853a97486448c0">fuse_reply_buf</a>(req, dh->contents, dh->len);</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span> out:</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>  pthread_mutex_unlock(&dh->lock);</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span> }</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span> </div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_readdir(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">size_t</span> size,</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>  off_t off, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi)</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span> {</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>  fuse_readdir_common(req, ino, size, off, llfi, 0);</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span> }</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span> </div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_readdirplus(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">size_t</span> size,</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>  off_t off, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi)</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span> {</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>  fuse_readdir_common(req, ino, size, off, llfi, FUSE_READDIR_PLUS);</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span> }</div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span> </div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_releasedir(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi)</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span> {</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi;</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>  <span class="keyword">struct </span>fuse_dh *dh = get_dirhandle(llfi, &fi);</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span> </div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>  get_path_nullok(f, ino, &path);</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span> </div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>  fuse_fs_releasedir(f->fs, path, &fi);</div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>  free_path(f, ino, path);</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span> </div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>  pthread_mutex_lock(&dh->lock);</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>  pthread_mutex_unlock(&dh->lock);</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>  pthread_mutex_destroy(&dh->lock);</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>  free_direntries(dh->first);</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>  free(dh->contents);</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>  free(dh);</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>  reply_err(req, 0);</div><div class="line"><a name="l03764"></a><span class="lineno"> 3764</span> }</div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span> </div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_fsyncdir(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">int</span> datasync,</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi)</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span> {</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi;</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span> </div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>  get_dirhandle(llfi, &fi);</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span> </div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>  err = fuse_fs_fsyncdir(f->fs, path, datasync, &fi);</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>  free_path(f, ino, path);</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>  }</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>  reply_err(req, err);</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span> }</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span> </div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_statfs(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino)</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span> {</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>  <span class="keyword">struct </span>statvfs buf;</div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>  <span class="keywordtype">char</span> *path = NULL;</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>  <span class="keywordtype">int</span> err = 0;</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span> </div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>  memset(&buf, 0, <span class="keyword">sizeof</span>(buf));</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>  <span class="keywordflow">if</span> (ino)</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span> </div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>  err = fuse_fs_statfs(f->fs, path ? path : <span class="stringliteral">"/"</span>, &buf);</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>  free_path(f, ino, path);</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>  }</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span> </div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>  <a class="code" href="fuse__lowlevel_8h.html#aa1d95ec3ca674253baac3639ea10f0ff">fuse_reply_statfs</a>(req, &buf);</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>  reply_err(req, err);</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span> }</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span> </div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_setxattr(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *value, <span class="keywordtype">size_t</span> size, <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span> {</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span> </div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>  err = fuse_fs_setxattr(f->fs, path, name, value, size, flags);</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>  free_path(f, ino, path);</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>  }</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>  reply_err(req, err);</div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span> }</div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span> </div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span> <span class="keyword">static</span> <span class="keywordtype">int</span> common_getxattr(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">char</span> *value, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span> {</div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span> </div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>  err = fuse_fs_getxattr(f->fs, path, name, value, size);</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>  free_path(f, ino, path);</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>  }</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span> }</div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span> </div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_getxattr(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>  <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l03849"></a><span class="lineno"> 3849</span> {</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span> </div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>  <span class="keywordflow">if</span> (size) {</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>  <span class="keywordtype">char</span> *value = (<span class="keywordtype">char</span> *) malloc(size);</div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>  <span class="keywordflow">if</span> (value == NULL) {</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>  reply_err(req, -ENOMEM);</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>  }</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>  res = common_getxattr(f, req, ino, name, value, size);</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>  <span class="keywordflow">if</span> (res > 0)</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>  <a class="code" href="fuse__lowlevel_8h.html#a300a88b63ab7c8ca92853a97486448c0">fuse_reply_buf</a>(req, value, res);</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>  reply_err(req, res);</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>  free(value);</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>  res = common_getxattr(f, req, ino, name, NULL, 0);</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>  <span class="keywordflow">if</span> (res >= 0)</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>  <a class="code" href="fuse__lowlevel_8h.html#afed32e5d3e1f54d390103f79ebb8bd42">fuse_reply_xattr</a>(req, res);</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>  reply_err(req, res);</div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>  }</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span> }</div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span> </div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span> <span class="keyword">static</span> <span class="keywordtype">int</span> common_listxattr(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>  <span class="keywordtype">char</span> *list, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span> {</div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span> </div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>  err = fuse_fs_listxattr(f->fs, path, list, size);</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>  free_path(f, ino, path);</div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>  }</div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span> }</div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span> </div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_listxattr(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span> {</div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span> </div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>  <span class="keywordflow">if</span> (size) {</div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>  <span class="keywordtype">char</span> *list = (<span class="keywordtype">char</span> *) malloc(size);</div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>  <span class="keywordflow">if</span> (list == NULL) {</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>  reply_err(req, -ENOMEM);</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>  }</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>  res = common_listxattr(f, req, ino, list, size);</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>  <span class="keywordflow">if</span> (res > 0)</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>  <a class="code" href="fuse__lowlevel_8h.html#a300a88b63ab7c8ca92853a97486448c0">fuse_reply_buf</a>(req, list, res);</div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>  reply_err(req, res);</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>  free(list);</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>  res = common_listxattr(f, req, ino, NULL, 0);</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>  <span class="keywordflow">if</span> (res >= 0)</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>  <a class="code" href="fuse__lowlevel_8h.html#afed32e5d3e1f54d390103f79ebb8bd42">fuse_reply_xattr</a>(req, res);</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>  reply_err(req, res);</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>  }</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span> }</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span> </div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_removexattr(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name)</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span> {</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span> </div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>  err = fuse_fs_removexattr(f->fs, path, name);</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>  free_path(f, ino, path);</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>  }</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>  reply_err(req, err);</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span> }</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span> </div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span> <span class="keyword">static</span> <span class="keyword">struct </span>lock *locks_conflict(<span class="keyword">struct</span> node *node, <span class="keyword">const</span> <span class="keyword">struct</span> lock *lock)</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span> {</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>  <span class="keyword">struct </span>lock *l;</div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span> </div><div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>  <span class="keywordflow">for</span> (l = node->locks; l; l = l->next)</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>  <span class="keywordflow">if</span> (l->owner != lock->owner &&</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>  lock->start <= l->end && l->start <= lock->end &&</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>  (l->type == F_WRLCK || lock->type == F_WRLCK))</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span> </div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>  <span class="keywordflow">return</span> l;</div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span> }</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span> </div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span> <span class="keyword">static</span> <span class="keywordtype">void</span> delete_lock(<span class="keyword">struct</span> lock **lockp)</div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span> {</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>  <span class="keyword">struct </span>lock *l = *lockp;</div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>  *lockp = l->next;</div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>  free(l);</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span> }</div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span> </div><div class="line"><a name="l03955"></a><span class="lineno"> 3955</span> <span class="keyword">static</span> <span class="keywordtype">void</span> insert_lock(<span class="keyword">struct</span> lock **pos, <span class="keyword">struct</span> lock *lock)</div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span> {</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>  lock->next = *pos;</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>  *pos = lock;</div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span> }</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span> </div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span> <span class="keyword">static</span> <span class="keywordtype">int</span> locks_insert(<span class="keyword">struct</span> node *node, <span class="keyword">struct</span> lock *lock)</div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span> {</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>  <span class="keyword">struct </span>lock **lp;</div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>  <span class="keyword">struct </span>lock *newl1 = NULL;</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>  <span class="keyword">struct </span>lock *newl2 = NULL;</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span> </div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>  <span class="keywordflow">if</span> (lock->type != F_UNLCK || lock->start != 0 ||</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>  lock->end != OFFSET_MAX) {</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>  newl1 = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> lock));</div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>  newl2 = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> lock));</div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span> </div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>  <span class="keywordflow">if</span> (!newl1 || !newl2) {</div><div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>  free(newl1);</div><div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>  free(newl2);</div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>  <span class="keywordflow">return</span> -ENOLCK;</div><div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>  }</div><div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>  }</div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span> </div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>  <span class="keywordflow">for</span> (lp = &node->locks; *lp;) {</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>  <span class="keyword">struct </span>lock *l = *lp;</div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>  <span class="keywordflow">if</span> (l->owner != lock->owner)</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>  <span class="keywordflow">goto</span> skip;</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span> </div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>  <span class="keywordflow">if</span> (lock->type == l->type) {</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>  <span class="keywordflow">if</span> (l->end < lock->start - 1)</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>  <span class="keywordflow">goto</span> skip;</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>  <span class="keywordflow">if</span> (lock->end < l->start - 1)</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>  <span class="keywordflow">if</span> (l->start <= lock->start && lock->end <= l->end)</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>  <span class="keywordflow">if</span> (l->start < lock->start)</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>  lock->start = l->start;</div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>  <span class="keywordflow">if</span> (lock->end < l->end)</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>  lock->end = l->end;</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>  <span class="keywordflow">goto</span> <span class="keyword">delete</span>;</div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>  <span class="keywordflow">if</span> (l->end < lock->start)</div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>  <span class="keywordflow">goto</span> skip;</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>  <span class="keywordflow">if</span> (lock->end < l->start)</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>  <span class="keywordflow">if</span> (lock->start <= l->start && l->end <= lock->end)</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>  <span class="keywordflow">goto</span> <span class="keyword">delete</span>;</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>  <span class="keywordflow">if</span> (l->end <= lock->end) {</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>  l->end = lock->start - 1;</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>  <span class="keywordflow">goto</span> skip;</div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>  }</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>  <span class="keywordflow">if</span> (lock->start <= l->start) {</div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>  l->start = lock->end + 1;</div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>  }</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>  *newl2 = *l;</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>  newl2->start = lock->end + 1;</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>  l->end = lock->start - 1;</div><div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>  insert_lock(&l->next, newl2);</div><div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>  newl2 = NULL;</div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>  }</div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>  skip:</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>  lp = &l->next;</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l04020"></a><span class="lineno"> 4020</span> </div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>  <span class="keyword">delete</span>:</div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>  delete_lock(lp);</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>  }</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>  <span class="keywordflow">if</span> (lock->type != F_UNLCK) {</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>  *newl1 = *lock;</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>  insert_lock(lp, newl1);</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>  newl1 = NULL;</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>  }</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span> out:</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>  free(newl1);</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>  free(newl2);</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span> }</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span> </div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span> <span class="keyword">static</span> <span class="keywordtype">void</span> flock_to_lock(<span class="keyword">struct</span> flock *flock, <span class="keyword">struct</span> lock *lock)</div><div class="line"><a name="l04036"></a><span class="lineno"> 4036</span> {</div><div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>  memset(lock, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> lock));</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>  lock->type = flock->l_type;</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>  lock->start = flock->l_start;</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>  lock->end =</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>  flock->l_len ? flock->l_start + flock->l_len - 1 : OFFSET_MAX;</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>  lock->pid = flock->l_pid;</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span> }</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span> </div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span> <span class="keyword">static</span> <span class="keywordtype">void</span> lock_to_flock(<span class="keyword">struct</span> lock *lock, <span class="keyword">struct</span> flock *flock)</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span> {</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>  flock->l_type = lock->type;</div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>  flock->l_start = lock->start;</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>  flock->l_len =</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>  (lock->end == OFFSET_MAX) ? 0 : lock->end - lock->start + 1;</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>  flock->l_pid = lock->pid;</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span> }</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span> </div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_flush_common(<span class="keyword">struct</span> fuse *f, <a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span> {</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>  <span class="keyword">struct </span>flock lock;</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>  <span class="keyword">struct </span>lock l;</div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>  <span class="keywordtype">int</span> errlock;</div><div class="line"><a name="l04062"></a><span class="lineno"> 4062</span> </div><div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>  memset(&lock, 0, <span class="keyword">sizeof</span>(lock));</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>  lock.l_type = F_UNLCK;</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>  lock.l_whence = SEEK_SET;</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>  err = fuse_fs_flush(f->fs, path, fi);</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>  errlock = fuse_fs_lock(f->fs, path, fi, F_SETLK, &lock);</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span> </div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>  <span class="keywordflow">if</span> (errlock != -ENOSYS) {</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>  flock_to_lock(&lock, &l);</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>  l.owner = fi-><a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a>;</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>  locks_insert(get_node(f, ino), &l);</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span> </div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>  <span class="comment">/* if op.lock() is defined FLUSH is needed regardless</span></div><div class="line"><a name="l04079"></a><span class="lineno"> 4079</span> <span class="comment"> of op.flush() */</span></div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>  <span class="keywordflow">if</span> (err == -ENOSYS)</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>  err = 0;</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>  }</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span> }</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span> </div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_release(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span> {</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>  <span class="keywordtype">int</span> err = 0;</div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span> </div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>  get_path_nullok(f, ino, &path);</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>  <span class="keywordflow">if</span> (fi-><a class="code" href="structfuse__file__info.html#a9c1571cb4b6be75827f48aac5891606c">flush</a>) {</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>  err = fuse_flush_common(f, req, ino, path, fi);</div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>  <span class="keywordflow">if</span> (err == -ENOSYS)</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>  err = 0;</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>  }</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span> </div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>  fuse_do_release(f, ino, path, fi);</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>  free_path(f, ino, path);</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span> </div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>  reply_err(req, err);</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span> }</div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span> </div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_flush(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span> {</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span> </div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>  get_path_nullok(f, ino, &path);</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>  err = fuse_flush_common(f, req, ino, path, fi);</div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>  free_path(f, ino, path);</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span> </div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>  reply_err(req, err);</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span> }</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span> </div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_lock_common(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keyword">struct</span> flock *lock,</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>  <span class="keywordtype">int</span> cmd)</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span> {</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span> </div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>  err = fuse_fs_lock(f->fs, path, fi, cmd, lock);</div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>  free_path(f, ino, path);</div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>  }</div><div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span> }</div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span> </div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_getlk(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keyword">struct</span> flock *lock)</div><div class="line"><a name="l04144"></a><span class="lineno"> 4144</span> {</div><div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>  <span class="keyword">struct </span>lock l;</div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>  <span class="keyword">struct </span>lock *conflict;</div><div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>  <span class="keyword">struct </span>fuse *f = req_fuse(req);</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span> </div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>  flock_to_lock(lock, &l);</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>  l.owner = fi-><a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a>;</div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>  conflict = locks_conflict(get_node(f, ino), &l);</div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>  <span class="keywordflow">if</span> (conflict)</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>  lock_to_flock(conflict, lock);</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>  <span class="keywordflow">if</span> (!conflict)</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>  err = fuse_lock_common(req, ino, fi, lock, F_GETLK);</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>  err = 0;</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span> </div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>  <a class="code" href="fuse__lowlevel_8h.html#a135eda9b7d36fb4eaae2de58526d4f85">fuse_reply_lock</a>(req, lock);</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>  reply_err(req, err);</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span> }</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span> </div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_setlk(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keyword">struct</span> flock *lock,</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>  <span class="keywordtype">int</span> sleep)</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span> {</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>  <span class="keywordtype">int</span> err = fuse_lock_common(req, ino, fi, lock,</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>  sleep ? F_SETLKW : F_SETLK);</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>  <span class="keyword">struct </span>fuse *f = req_fuse(req);</div><div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>  <span class="keyword">struct </span>lock l;</div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>  flock_to_lock(lock, &l);</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>  l.owner = fi-><a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a>;</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>  locks_insert(get_node(f, ino), &l);</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>  }</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>  reply_err(req, err);</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span> }</div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span> </div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_flock(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keywordtype">int</span> op)</div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span> {</div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span> </div><div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>  <span class="keywordflow">if</span> (err == 0) {</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>  err = fuse_fs_flock(f->fs, path, fi, op);</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>  free_path(f, ino, path);</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>  }</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>  reply_err(req, err);</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span> }</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span> </div><div class="line"><a name="l04204"></a><span class="lineno"> 4204</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_bmap(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">size_t</span> blocksize,</div><div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>  uint64_t idx)</div><div class="line"><a name="l04206"></a><span class="lineno"> 4206</span> {</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span> </div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>  err = get_path(f, ino, &path);</div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>  err = fuse_fs_bmap(f->fs, path, blocksize, &idx);</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>  free_path(f, ino, path);</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>  }</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>  <a class="code" href="fuse__lowlevel_8h.html#a65431e8196e0533257acad767f7b074f">fuse_reply_bmap</a>(req, idx);</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>  reply_err(req, err);</div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span> }</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span> </div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_ioctl(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">int</span> cmd, <span class="keywordtype">void</span> *arg,</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *llfi, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags,</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>  <span class="keyword">const</span> <span class="keywordtype">void</span> *in_buf, <span class="keywordtype">size_t</span> in_bufsz,</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>  <span class="keywordtype">size_t</span> out_bufsz)</div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span> {</div><div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi;</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>  <span class="keywordtype">char</span> *path, *out_buf = NULL;</div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span> </div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>  err = -EPERM;</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>  <span class="keywordflow">if</span> (flags & FUSE_IOCTL_UNRESTRICTED)</div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>  <span class="keywordflow">goto</span> err;</div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span> </div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>  <span class="keywordflow">if</span> (flags & FUSE_IOCTL_DIR)</div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>  get_dirhandle(llfi, &fi);</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>  fi = *llfi;</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span> </div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>  <span class="keywordflow">if</span> (out_bufsz) {</div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>  err = -ENOMEM;</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>  out_buf = malloc(out_bufsz);</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>  <span class="keywordflow">if</span> (!out_buf)</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>  <span class="keywordflow">goto</span> err;</div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>  }</div><div class="line"><a name="l04251"></a><span class="lineno"> 4251</span> </div><div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>  assert(!in_bufsz || !out_bufsz || in_bufsz == out_bufsz);</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>  <span class="keywordflow">if</span> (out_buf && in_bufsz)</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>  memcpy(out_buf, in_buf, in_bufsz);</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span> </div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>  <span class="keywordflow">if</span> (err)</div><div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>  <span class="keywordflow">goto</span> err;</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span> </div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span> </div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>  err = fuse_fs_ioctl(f->fs, path, cmd, arg, &fi, flags,</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>  out_buf ?: (<span class="keywordtype">void</span> *)in_buf);</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span> </div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>  free_path(f, ino, path);</div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span> </div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>  <a class="code" href="fuse__lowlevel_8h.html#adf7f34f470c04f276b7091ad3b3dcb31">fuse_reply_ioctl</a>(req, err, out_buf, out_bufsz);</div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span> err:</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>  reply_err(req, err);</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span> out:</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>  free(out_buf);</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span> }</div><div class="line"><a name="l04275"></a><span class="lineno"> 4275</span> </div><div class="line"><a name="l04276"></a><span class="lineno"> 4276</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_poll(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi, <span class="keyword">struct</span> fuse_pollhandle *ph)</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span> {</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>  <span class="keywordtype">unsigned</span> revents = 0;</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span> </div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>  err = fuse_fs_poll(f->fs, path, fi, ph, &revents);</div><div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>  free_path(f, ino, path);</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>  }</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>  <span class="keywordflow">if</span> (!err)</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>  <a class="code" href="fuse__lowlevel_8h.html#a2172d260d34c76c25cd601870aee4220">fuse_reply_poll</a>(req, revents);</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>  reply_err(req, err);</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span> }</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span> </div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_fallocate(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino, <span class="keywordtype">int</span> mode,</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>  off_t offset, off_t length, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi)</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span> {</div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span> </div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>  err = get_path_nullok(f, ino, &path);</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>  <span class="keywordflow">if</span> (!err) {</div><div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>  err = fuse_fs_fallocate(f->fs, path, mode, offset, length, fi);</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>  free_path(f, ino, path);</div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>  }</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>  reply_err(req, err);</div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span> }</div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span> </div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_lib_copy_file_range(<a class="code" href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid_in,</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>  off_t off_in, <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi_in,</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid_out, off_t off_out,</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi_out, <span class="keywordtype">size_t</span> len,</div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>  <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span> {</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>  <span class="keyword">struct </span>fuse *f = req_fuse_prepare(req);</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>  <span class="keyword">struct </span>fuse_intr_data d;</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>  <span class="keywordtype">char</span> *path_in, *path_out;</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>  ssize_t res;</div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span> </div><div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>  err = get_path_nullok(f, nodeid_in, &path_in);</div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>  reply_err(req, err);</div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>  }</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span> </div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>  err = get_path_nullok(f, nodeid_out, &path_out);</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>  free_path(f, nodeid_in, path_in);</div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>  reply_err(req, err);</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>  }</div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span> </div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>  fuse_prepare_interrupt(f, req, &d);</div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>  res = fuse_fs_copy_file_range(f->fs, path_in, fi_in, off_in, path_out,</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>  fi_out, off_out, len, flags);</div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>  fuse_finish_interrupt(f, req, &d);</div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span> </div><div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>  <span class="keywordflow">if</span> (res >= 0)</div><div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>  <a class="code" href="fuse__lowlevel_8h.html#aa3cfa73f61d6ef461ab5a3fbf859eb97">fuse_reply_write</a>(req, res);</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>  reply_err(req, res);</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span> </div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>  free_path(f, nodeid_in, path_in);</div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>  free_path(f, nodeid_out, path_out);</div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span> }</div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span> </div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span> <span class="keyword">static</span> <span class="keywordtype">int</span> clean_delay(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span> {</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>  <span class="comment">/*</span></div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span> <span class="comment"> * This is calculating the delay between clean runs. To</span></div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span> <span class="comment"> * reduce the number of cleans we are doing them 10 times</span></div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span> <span class="comment"> * within the remember window.</span></div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span> <span class="comment"> */</span></div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>  <span class="keywordtype">int</span> min_sleep = 60;</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>  <span class="keywordtype">int</span> max_sleep = 3600;</div><div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>  <span class="keywordtype">int</span> sleep_time = f->conf.remember / 10;</div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span> </div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>  <span class="keywordflow">if</span> (sleep_time > max_sleep)</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>  <span class="keywordflow">return</span> max_sleep;</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>  <span class="keywordflow">if</span> (sleep_time < min_sleep)</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>  <span class="keywordflow">return</span> min_sleep;</div><div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>  <span class="keywordflow">return</span> sleep_time;</div><div class="line"><a name="l04371"></a><span class="lineno"> 4371</span> }</div><div class="line"><a name="l04372"></a><span class="lineno"> 4372</span> </div><div class="line"><a name="l04373"></a><span class="lineno"><a class="line" href="fuse_8h.html#a90f104e6d4e01480161a3300bddbecbe"> 4373</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a90f104e6d4e01480161a3300bddbecbe">fuse_clean_cache</a>(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span> {</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>  <span class="keyword">struct </span>node_lru *lnode;</div><div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>  <span class="keyword">struct </span>list_head *curr, *next;</div><div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>  <span class="keyword">struct </span>timespec now;</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span> </div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span> </div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>  curr_time(&now);</div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span> </div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>  <span class="keywordflow">for</span> (curr = f->lru_table.next; curr != &f->lru_table; curr = next) {</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>  <span class="keywordtype">double</span> age;</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span> </div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>  next = curr->next;</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>  lnode = list_entry(curr, <span class="keyword">struct</span> node_lru, lru);</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>  node = &lnode->node;</div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span> </div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>  age = diff_timespec(&now, &lnode->forget_time);</div><div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>  <span class="keywordflow">if</span> (age <= f->conf.remember)</div><div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span> </div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>  assert(node->nlookup == 1);</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span> </div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>  <span class="comment">/* Don't forget active directories */</span></div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>  <span class="keywordflow">if</span> (node->refctr > 1)</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span> </div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>  node->nlookup = 0;</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>  unhash_name(f, node);</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>  unref_node(f, node);</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>  }</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span> </div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>  <span class="keywordflow">return</span> clean_delay(f);</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span> }</div><div class="line"><a name="l04409"></a><span class="lineno"> 4409</span> </div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</span> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structfuse__lowlevel__ops.html">fuse_lowlevel_ops</a> fuse_path_ops = {</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>  .<a class="code" href="structfuse__lowlevel__ops.html#aa8ed20e1d06c42a386404fba0d3e56b5">init</a> = fuse_lib_init,</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>  .destroy = fuse_lib_destroy,</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>  .lookup = fuse_lib_lookup,</div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>  .forget = fuse_lib_forget,</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>  .forget_multi = fuse_lib_forget_multi,</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>  .getattr = fuse_lib_getattr,</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>  .setattr = fuse_lib_setattr,</div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>  .access = fuse_lib_access,</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>  .readlink = fuse_lib_readlink,</div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>  .mknod = fuse_lib_mknod,</div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>  .mkdir = fuse_lib_mkdir,</div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>  .unlink = fuse_lib_unlink,</div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>  .rmdir = fuse_lib_rmdir,</div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>  .symlink = fuse_lib_symlink,</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>  .rename = fuse_lib_rename,</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>  .link = fuse_lib_link,</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>  .create = fuse_lib_create,</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>  .open = fuse_lib_open,</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>  .read = fuse_lib_read,</div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>  .write_buf = fuse_lib_write_buf,</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>  .flush = fuse_lib_flush,</div><div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>  .release = fuse_lib_release,</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>  .fsync = fuse_lib_fsync,</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>  .opendir = fuse_lib_opendir,</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>  .readdir = fuse_lib_readdir,</div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>  .readdirplus = fuse_lib_readdirplus,</div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>  .releasedir = fuse_lib_releasedir,</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>  .fsyncdir = fuse_lib_fsyncdir,</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>  .statfs = fuse_lib_statfs,</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>  .setxattr = fuse_lib_setxattr,</div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>  .getxattr = fuse_lib_getxattr,</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>  .listxattr = fuse_lib_listxattr,</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>  .removexattr = fuse_lib_removexattr,</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>  .getlk = fuse_lib_getlk,</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>  .setlk = fuse_lib_setlk,</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>  .flock = fuse_lib_flock,</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>  .bmap = fuse_lib_bmap,</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>  .ioctl = fuse_lib_ioctl,</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>  .poll = fuse_lib_poll,</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>  .fallocate = fuse_lib_fallocate,</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>  .copy_file_range = fuse_lib_copy_file_range,</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span> };</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span> </div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span> <span class="keywordtype">int</span> fuse_notify_poll(<span class="keyword">struct</span> fuse_pollhandle *ph)</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span> {</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>  <span class="keywordflow">return</span> <a class="code" href="fuse__lowlevel_8h.html#ab078685b1f480188031fc40aa2e2fbca">fuse_lowlevel_notify_poll</a>(ph);</div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span> }</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span> </div><div class="line"><a name="l04459"></a><span class="lineno"><a class="line" href="fuse_8h.html#a03baa193b5bfcbe625afbc62e9b97e91"> 4459</a></span> <span class="keyword">struct </span>fuse_session *<a class="code" href="fuse_8h.html#a03baa193b5bfcbe625afbc62e9b97e91">fuse_get_session</a>(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span> {</div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>  <span class="keywordflow">return</span> f->se;</div><div class="line"><a name="l04462"></a><span class="lineno"> 4462</span> }</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span> </div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_session_loop_remember(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04465"></a><span class="lineno"> 4465</span> {</div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>  <span class="keyword">struct </span>fuse_session *se = f->se;</div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>  <span class="keywordtype">int</span> res = 0;</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>  <span class="keyword">struct </span>timespec now;</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>  time_t next_clean;</div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>  <span class="keyword">struct </span>pollfd fds = {</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>  .fd = se->fd,</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>  .events = POLLIN</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>  };</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>  <span class="keyword">struct </span><a class="code" href="structfuse__buf.html">fuse_buf</a> fbuf = {</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>  .<a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a> = NULL,</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>  };</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span> </div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>  curr_time(&now);</div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>  next_clean = now.tv_sec;</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>  <span class="keywordflow">while</span> (!<a class="code" href="fuse__lowlevel_8h.html#a41b12193fa1520ff658d65679f4e513c">fuse_session_exited</a>(se)) {</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>  <span class="keywordtype">unsigned</span> timeout;</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span> </div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>  curr_time(&now);</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>  <span class="keywordflow">if</span> (now.tv_sec < next_clean)</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>  timeout = next_clean - now.tv_sec;</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>  timeout = 0;</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span> </div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>  res = poll(&fds, 1, timeout * 1000);</div><div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>  <span class="keywordflow">if</span> (errno == -EINTR)</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (res > 0) {</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>  res = fuse_session_receive_buf_int(se, &fbuf, NULL);</div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span> </div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>  <span class="keywordflow">if</span> (res == -EINTR)</div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>  <span class="keywordflow">if</span> (res <= 0)</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span> </div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>  fuse_session_process_buf_int(se, &fbuf, NULL);</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>  timeout = <a class="code" href="fuse_8h.html#a90f104e6d4e01480161a3300bddbecbe">fuse_clean_cache</a>(f);</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>  curr_time(&now);</div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>  next_clean = now.tv_sec + timeout;</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>  }</div><div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>  }</div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span> </div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>  free(fbuf.<a class="code" href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">mem</a>);</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>  <a class="code" href="fuse__lowlevel_8h.html#ab3d015de77ae0edeb3157321e7a5c434">fuse_session_reset</a>(se);</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>  <span class="keywordflow">return</span> res < 0 ? -1 : 0;</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span> }</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span> </div><div class="line"><a name="l04516"></a><span class="lineno"><a class="line" href="fuse_8h.html#a6ea805c47ccc960497dfd64e12081159"> 4516</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a6ea805c47ccc960497dfd64e12081159">fuse_loop</a>(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span> {</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>  <span class="keywordflow">if</span> (!f)</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span> </div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>  <span class="keywordflow">if</span> (lru_enabled(f))</div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>  <span class="keywordflow">return</span> fuse_session_loop_remember(f);</div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span> </div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>  <span class="keywordflow">return</span> <a class="code" href="fuse__lowlevel_8h.html#a5f1e538aa3287e251afbe985438c4249">fuse_session_loop</a>(f->se);</div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span> }</div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span> </div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span> FUSE_SYMVER(<span class="stringliteral">".symver fuse_loop_mt_32,fuse_loop_mt@@FUSE_3.2"</span>);</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span> <span class="keywordtype">int</span> fuse_loop_mt_32(<span class="keyword">struct</span> fuse *f, <span class="keyword">struct</span> <a class="code" href="structfuse__loop__config.html">fuse_loop_config</a> *config)</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span> {</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>  <span class="keywordflow">if</span> (f == NULL)</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span> </div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>  <span class="keywordtype">int</span> res = <a class="code" href="fuse_8h.html#a4b2246caec521ec4ac84093f8c4b616d">fuse_start_cleanup_thread</a>(f);</div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>  <span class="keywordflow">if</span> (res)</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span> </div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>  res = fuse_session_loop_mt_32(<a class="code" href="fuse_8h.html#a03baa193b5bfcbe625afbc62e9b97e91">fuse_get_session</a>(f), config);</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>  <a class="code" href="fuse_8h.html#ad37fd69ba40d5c261f16e207e4a5b0ed">fuse_stop_cleanup_thread</a>(f);</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l04540"></a><span class="lineno"> 4540</span> }</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span> </div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a8fb55dfd425856e0b10f4a2836e6f9f0">fuse_loop_mt_31</a>(<span class="keyword">struct</span> fuse *f, <span class="keywordtype">int</span> clone_fd);</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span> FUSE_SYMVER(<span class="stringliteral">".symver fuse_loop_mt_31,fuse_loop_mt@FUSE_3.0"</span>);</div><div class="line"><a name="l04544"></a><span class="lineno"><a class="line" href="fuse_8h.html#a8fb55dfd425856e0b10f4a2836e6f9f0"> 4544</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a8fb55dfd425856e0b10f4a2836e6f9f0">fuse_loop_mt_31</a>(<span class="keyword">struct</span> fuse *f, <span class="keywordtype">int</span> clone_fd)</div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span> {</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>  <span class="keyword">struct </span><a class="code" href="structfuse__loop__config.html">fuse_loop_config</a> config;</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>  config.<a class="code" href="structfuse__loop__config.html#a6a8527939446625e5466cd8baf399f08">clone_fd</a> = <a class="code" href="structfuse__loop__config.html#a6a8527939446625e5466cd8baf399f08">clone_fd</a>;</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>  config.<a class="code" href="structfuse__loop__config.html#ab9412a7c922432f6d3cdcfacb5aaa032">max_idle_threads</a> = 10;</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>  <span class="keywordflow">return</span> fuse_loop_mt_32(f, &config);</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span> }</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span> </div><div class="line"><a name="l04552"></a><span class="lineno"><a class="line" href="fuse_8h.html#a9024935b211288c1869dc7566895d739"> 4552</a></span> <span class="keywordtype">void</span> <a class="code" href="fuse_8h.html#a9024935b211288c1869dc7566895d739">fuse_exit</a>(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span> {</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>  <a class="code" href="fuse__lowlevel_8h.html#a198429f3fbc23ef29ef9971271827690">fuse_session_exit</a>(f->se);</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span> }</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span> </div><div class="line"><a name="l04557"></a><span class="lineno"><a class="line" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc"> 4557</a></span> <span class="keyword">struct </span><a class="code" href="structfuse__context.html">fuse_context</a> *<a class="code" href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span> {</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>  <span class="keyword">struct </span>fuse_context_i *c = fuse_get_context_internal();</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span> </div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>  <span class="keywordflow">if</span> (c)</div><div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>  <span class="keywordflow">return</span> &c->ctx;</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span> }</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span> </div><div class="line"><a name="l04567"></a><span class="lineno"><a class="line" href="fuse_8h.html#a04273db088e57d8242caa388193b6958"> 4567</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a04273db088e57d8242caa388193b6958">fuse_getgroups</a>(<span class="keywordtype">int</span> size, gid_t list[])</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span> {</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>  <span class="keyword">struct </span>fuse_context_i *c = fuse_get_context_internal();</div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>  <span class="keywordflow">if</span> (!c)</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>  <span class="keywordflow">return</span> -EINVAL;</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span> </div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>  <span class="keywordflow">return</span> <a class="code" href="fuse__lowlevel_8h.html#a57f4dabcf044aafcdba6c4682b3a1869">fuse_req_getgroups</a>(c->req, size, list);</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span> }</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span> </div><div class="line"><a name="l04576"></a><span class="lineno"><a class="line" href="fuse_8h.html#a0514ca828e6a02a330dcf037292c8803"> 4576</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a0514ca828e6a02a330dcf037292c8803">fuse_interrupted</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span> {</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>  <span class="keyword">struct </span>fuse_context_i *c = fuse_get_context_internal();</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span> </div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>  <span class="keywordflow">if</span> (c)</div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>  <span class="keywordflow">return</span> <a class="code" href="fuse__lowlevel_8h.html#a52674fc627647f33e63c74267f0f1f9d">fuse_req_interrupted</a>(c->req);</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span> }</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span> </div><div class="line"><a name="l04586"></a><span class="lineno"><a class="line" href="fuse_8h.html#a56c1dfbdfaf10818dbc6c2ca6264f19a"> 4586</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a56c1dfbdfaf10818dbc6c2ca6264f19a">fuse_invalidate_path</a>(<span class="keyword">struct</span> fuse *f, <span class="keyword">const</span> <span class="keywordtype">char</span> *path) {</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>  <a class="code" href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino;</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>  <span class="keywordtype">int</span> err = lookup_path_in_cache(f, path, &ino);</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>  <span class="keywordflow">return</span> err;</div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>  }</div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span> </div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>  <span class="keywordflow">return</span> <a class="code" href="fuse__lowlevel_8h.html#a9cb974af9745294ff446d11cba2422f1">fuse_lowlevel_notify_inval_inode</a>(f->se, ino, 0, 0);</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span> }</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span> </div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span> <span class="preprocessor">#define FUSE_LIB_OPT(t, p, v) { t, offsetof(struct fuse_config, p), v }</span></div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span> </div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structfuse__opt.html">fuse_opt</a> fuse_lib_opts[] = {</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>  <a class="code" href="fuse__opt_8h.html#a371d830a8aedd9e3f96d9bb31876a8f1">FUSE_OPT_KEY</a>(<span class="stringliteral">"debug"</span>, <a class="code" href="fuse__opt_8h.html#a8533ff341f910c1bd05f10c8fcc35a04">FUSE_OPT_KEY_KEEP</a>),</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>  <a class="code" href="fuse__opt_8h.html#a371d830a8aedd9e3f96d9bb31876a8f1">FUSE_OPT_KEY</a>(<span class="stringliteral">"-d"</span>, <a class="code" href="fuse__opt_8h.html#a8533ff341f910c1bd05f10c8fcc35a04">FUSE_OPT_KEY_KEEP</a>),</div><div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>  FUSE_LIB_OPT(<span class="stringliteral">"debug"</span>, debug, 1),</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>  FUSE_LIB_OPT(<span class="stringliteral">"-d"</span>, debug, 1),</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>  FUSE_LIB_OPT(<span class="stringliteral">"kernel_cache"</span>, kernel_cache, 1),</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>  FUSE_LIB_OPT(<span class="stringliteral">"auto_cache"</span>, auto_cache, 1),</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>  FUSE_LIB_OPT(<span class="stringliteral">"noauto_cache"</span>, auto_cache, 0),</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>  FUSE_LIB_OPT(<span class="stringliteral">"umask="</span>, set_mode, 1),</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>  FUSE_LIB_OPT(<span class="stringliteral">"umask=%o"</span>, umask, 0),</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>  FUSE_LIB_OPT(<span class="stringliteral">"uid="</span>, set_uid, 1),</div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>  FUSE_LIB_OPT(<span class="stringliteral">"uid=%d"</span>, uid, 0),</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>  FUSE_LIB_OPT(<span class="stringliteral">"gid="</span>, set_gid, 1),</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>  FUSE_LIB_OPT(<span class="stringliteral">"gid=%d"</span>, gid, 0),</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>  FUSE_LIB_OPT(<span class="stringliteral">"entry_timeout=%lf"</span>, entry_timeout, 0),</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>  FUSE_LIB_OPT(<span class="stringliteral">"attr_timeout=%lf"</span>, attr_timeout, 0),</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>  FUSE_LIB_OPT(<span class="stringliteral">"ac_attr_timeout=%lf"</span>, ac_attr_timeout, 0),</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>  FUSE_LIB_OPT(<span class="stringliteral">"ac_attr_timeout="</span>, ac_attr_timeout_set, 1),</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>  FUSE_LIB_OPT(<span class="stringliteral">"negative_timeout=%lf"</span>, negative_timeout, 0),</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>  FUSE_LIB_OPT(<span class="stringliteral">"noforget"</span>, remember, -1),</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>  FUSE_LIB_OPT(<span class="stringliteral">"remember=%u"</span>, remember, 0),</div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>  FUSE_LIB_OPT(<span class="stringliteral">"modules=%s"</span>, modules, 0),</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>  <a class="code" href="fuse__opt_8h.html#aca35962e17d189ceb5447f8eea11bd33">FUSE_OPT_END</a></div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span> };</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span> </div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_lib_opt_proc(<span class="keywordtype">void</span> *data, <span class="keyword">const</span> <span class="keywordtype">char</span> *arg, <span class="keywordtype">int</span> key,</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__args.html">fuse_args</a> *outargs)</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span> {</div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>  (void) arg; (void) outargs; (void) data; (void) key;</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span> </div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>  <span class="comment">/* Pass through unknown options */</span></div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span> }</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span> </div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span> </div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structfuse__opt.html">fuse_opt</a> fuse_help_opts[] = {</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>  FUSE_LIB_OPT(<span class="stringliteral">"modules=%s"</span>, modules, 1),</div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>  <a class="code" href="fuse__opt_8h.html#a371d830a8aedd9e3f96d9bb31876a8f1">FUSE_OPT_KEY</a>(<span class="stringliteral">"modules=%s"</span>, <a class="code" href="fuse__opt_8h.html#a8533ff341f910c1bd05f10c8fcc35a04">FUSE_OPT_KEY_KEEP</a>),</div><div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>  <a class="code" href="fuse__opt_8h.html#aca35962e17d189ceb5447f8eea11bd33">FUSE_OPT_END</a></div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span> };</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span> </div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span> <span class="keyword">static</span> <span class="keywordtype">void</span> print_module_help(<span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>  <a class="code" href="fuse_8h.html#ab92480001ec4f475a082cbd32bee94e2">fuse_module_factory_t</a> *fac)</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span> {</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>  <span class="keyword">struct </span><a class="code" href="structfuse__args.html">fuse_args</a> a = <a class="code" href="fuse__opt_8h.html#a9bea40fe56b18be9aa110185ab7387ed">FUSE_ARGS_INIT</a>(0, NULL);</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__opt_8h.html#a21602e6a0fff64fc9c7b642d12382094">fuse_opt_add_arg</a>(&a, <span class="stringliteral">""</span>) == -1 ||</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>  <a class="code" href="fuse__opt_8h.html#a21602e6a0fff64fc9c7b642d12382094">fuse_opt_add_arg</a>(&a, <span class="stringliteral">"-h"</span>) == -1)</div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>  printf(<span class="stringliteral">"\nOptions for %s module:\n"</span>, name);</div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>  (*fac)(&a, NULL);</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span> }</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span> </div><div class="line"><a name="l04650"></a><span class="lineno"><a class="line" href="fuse_8h.html#a9cef8443ae22c4bcc800d7c45f1496fe"> 4650</a></span> <span class="keywordtype">void</span> <a class="code" href="fuse_8h.html#a9cef8443ae22c4bcc800d7c45f1496fe">fuse_lib_help</a>(<span class="keyword">struct</span> <a class="code" href="structfuse__args.html">fuse_args</a> *args)</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span> {</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>  <span class="comment">/* These are not all options, but only the ones that</span></div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span> <span class="comment"> may be of interest to an end-user */</span></div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>  printf(</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span> <span class="stringliteral">" -o kernel_cache cache files in kernel\n"</span></div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span> <span class="stringliteral">" -o [no]auto_cache enable caching based on modification times (off)\n"</span></div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span> <span class="stringliteral">" -o umask=M set file permissions (octal)\n"</span></div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span> <span class="stringliteral">" -o uid=N set file owner\n"</span></div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</span> <span class="stringliteral">" -o gid=N set file group\n"</span></div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span> <span class="stringliteral">" -o entry_timeout=T cache timeout for names (1.0s)\n"</span></div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span> <span class="stringliteral">" -o negative_timeout=T cache timeout for deleted names (0.0s)\n"</span></div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span> <span class="stringliteral">" -o attr_timeout=T cache timeout for attributes (1.0s)\n"</span></div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span> <span class="stringliteral">" -o ac_attr_timeout=T auto cache timeout for attributes (attr_timeout)\n"</span></div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span> <span class="stringliteral">" -o noforget never forget cached inodes\n"</span></div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span> <span class="stringliteral">" -o remember=T remember cached inodes for T seconds (0s)\n"</span></div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span> <span class="stringliteral">" -o modules=M1[:M2...] names of modules to push onto filesystem stack\n"</span>);</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span> </div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span> </div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>  <span class="comment">/* Print low-level help */</span></div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>  <a class="code" href="fuse__lowlevel_8h.html#a990af0becaba1b5e45781d399720f85e">fuse_lowlevel_help</a>();</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span> </div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>  <span class="comment">/* Print help for builtin modules */</span></div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>  print_module_help(<span class="stringliteral">"subdir"</span>, &fuse_module_subdir_factory);</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span> <span class="preprocessor">#ifdef HAVE_ICONV</span></div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>  print_module_help(<span class="stringliteral">"iconv"</span>, &fuse_module_iconv_factory);</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span> </div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>  <span class="comment">/* Parse command line options in case we need to</span></div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span> <span class="comment"> activate more modules */</span></div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>  <span class="keyword">struct </span><a class="code" href="structfuse__config.html">fuse_config</a> conf = { .modules = NULL };</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__opt_8h.html#a539ef1f571c34f516c60c4cbe2901c0e">fuse_opt_parse</a>(args, &conf, fuse_help_opts,</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>  fuse_lib_opt_proc) == -1</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>  || !conf.modules)</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>  </div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>  <span class="keywordtype">char</span> *module;</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>  <span class="keywordtype">char</span> *next;</div><div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *m;</div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span> </div><div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>  <span class="comment">// Iterate over all modules</span></div><div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>  <span class="keywordflow">for</span> (module = conf.modules; module; module = next) {</div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>  <span class="keywordtype">char</span> *p;</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>  <span class="keywordflow">for</span> (p = module; *p && *p != <span class="charliteral">':'</span>; p++);</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>  next = *p ? p + 1 : NULL;</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>  *p = <span class="charliteral">'\0'</span>;</div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span> </div><div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>  m = fuse_get_module(module);</div><div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>  <span class="keywordflow">if</span> (m)</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>  print_module_help(module, &m->factory);</div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>  }</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span> }</div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span> </div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>  </div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span> </div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_init_intr_signal(<span class="keywordtype">int</span> signum, <span class="keywordtype">int</span> *installed)</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span> {</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>  <span class="keyword">struct </span>sigaction old_sa;</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span> </div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>  <span class="keywordflow">if</span> (sigaction(signum, NULL, &old_sa) == -1) {</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>  perror(<span class="stringliteral">"fuse: cannot get old signal handler"</span>);</div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>  }</div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span> </div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>  <span class="keywordflow">if</span> (old_sa.sa_handler == SIG_DFL) {</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>  <span class="keyword">struct </span>sigaction sa;</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span> </div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>  memset(&sa, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> sigaction));</div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>  sa.sa_handler = fuse_intr_sighandler;</div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>  sigemptyset(&sa.sa_mask);</div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span> </div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>  <span class="keywordflow">if</span> (sigaction(signum, &sa, NULL) == -1) {</div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>  perror(<span class="stringliteral">"fuse: cannot set interrupt signal handler"</span>);</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>  }</div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>  *installed = 1;</div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>  }</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span> }</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span> </div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_restore_intr_signal(<span class="keywordtype">int</span> signum)</div><div class="line"><a name="l04731"></a><span class="lineno"> 4731</span> {</div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>  <span class="keyword">struct </span>sigaction sa;</div><div class="line"><a name="l04733"></a><span class="lineno"> 4733</span> </div><div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>  memset(&sa, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> sigaction));</div><div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>  sa.sa_handler = SIG_DFL;</div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>  sigaction(signum, &sa, NULL);</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span> }</div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span> </div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span> </div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_push_module(<span class="keyword">struct</span> fuse *f, <span class="keyword">const</span> <span class="keywordtype">char</span> *module,</div><div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__args.html">fuse_args</a> *args)</div><div class="line"><a name="l04742"></a><span class="lineno"> 4742</span> {</div><div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>  <span class="keyword">struct </span>fuse_fs *fs[2] = { f->fs, NULL };</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>  <span class="keyword">struct </span>fuse_fs *newfs;</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>  <span class="keyword">struct </span><a class="code" href="structfuse__module.html">fuse_module</a> *m = fuse_get_module(module);</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span> </div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>  <span class="keywordflow">if</span> (!m)</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span> </div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>  newfs = m->factory(args, fs);</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>  <span class="keywordflow">if</span> (!newfs) {</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>  fuse_put_module(m);</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>  }</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>  newfs->m = m;</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>  f->fs = newfs;</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span> }</div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span> </div><div class="line"><a name="l04760"></a><span class="lineno"><a class="line" href="fuse_8h.html#a74883ac07b1794da7affbd95251d25d7"> 4760</a></span> <span class="keyword">struct </span>fuse_fs *<a class="code" href="fuse_8h.html#a74883ac07b1794da7affbd95251d25d7">fuse_fs_new</a>(<span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__operations.html">fuse_operations</a> *op, <span class="keywordtype">size_t</span> op_size,</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>  <span class="keywordtype">void</span> *user_data)</div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span> {</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>  <span class="keyword">struct </span>fuse_fs *fs;</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span> </div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structfuse__operations.html">fuse_operations</a>) < op_size) {</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>  fprintf(stderr, <span class="stringliteral">"fuse: warning: library too old, some operations may not not work\n"</span>);</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>  op_size = <span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structfuse__operations.html">fuse_operations</a>);</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>  }</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span> </div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>  fs = (<span class="keyword">struct </span>fuse_fs *) calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_fs));</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>  <span class="keywordflow">if</span> (!fs) {</div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>  fprintf(stderr, <span class="stringliteral">"fuse: failed to allocate fuse_fs object\n"</span>);</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>  }</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span> </div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>  fs->user_data = user_data;</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>  <span class="keywordflow">if</span> (op)</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>  memcpy(&fs->op, op, op_size);</div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>  <span class="keywordflow">return</span> fs;</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span> }</div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span> </div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span> <span class="keyword">static</span> <span class="keywordtype">int</span> node_table_init(<span class="keyword">struct</span> node_table *t)</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span> {</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>  t->size = NODE_TABLE_MIN_SIZE;</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>  t->array = (<span class="keyword">struct </span>node **) calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> node *) * t->size);</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>  <span class="keywordflow">if</span> (t->array == NULL) {</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>  fprintf(stderr, <span class="stringliteral">"fuse: memory allocation failed\n"</span>);</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>  }</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>  t->use = 0;</div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>  t->split = 0;</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span> </div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span> }</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span> </div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span> <span class="keyword">static</span> <span class="keywordtype">void</span> *fuse_prune_nodes(<span class="keywordtype">void</span> *fuse)</div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span> {</div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>  <span class="keyword">struct </span>fuse *f = fuse;</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>  <span class="keywordtype">int</span> sleep_time;</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span> </div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>  <span class="keywordflow">while</span>(1) {</div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>  sleep_time = <a class="code" href="fuse_8h.html#a90f104e6d4e01480161a3300bddbecbe">fuse_clean_cache</a>(f);</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>  sleep(sleep_time);</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>  }</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span> }</div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span> </div><div class="line"><a name="l04808"></a><span class="lineno"><a class="line" href="fuse_8h.html#a4b2246caec521ec4ac84093f8c4b616d"> 4808</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a4b2246caec521ec4ac84093f8c4b616d">fuse_start_cleanup_thread</a>(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span> {</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>  <span class="keywordflow">if</span> (lru_enabled(f))</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>  <span class="keywordflow">return</span> fuse_start_thread(&f->prune_thread, fuse_prune_nodes, f);</div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span> </div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span> }</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span> </div><div class="line"><a name="l04816"></a><span class="lineno"><a class="line" href="fuse_8h.html#ad37fd69ba40d5c261f16e207e4a5b0ed"> 4816</a></span> <span class="keywordtype">void</span> <a class="code" href="fuse_8h.html#ad37fd69ba40d5c261f16e207e4a5b0ed">fuse_stop_cleanup_thread</a>(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span> {</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>  <span class="keywordflow">if</span> (lru_enabled(f)) {</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>  pthread_mutex_lock(&f->lock);</div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>  pthread_cancel(f->prune_thread);</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>  pthread_mutex_unlock(&f->lock);</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>  pthread_join(f->prune_thread, NULL);</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>  }</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span> }</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span> </div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span> </div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span> FUSE_SYMVER(<span class="stringliteral">".symver fuse_new_31,fuse_new@@FUSE_3.1"</span>);</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span> <span class="keyword">struct </span>fuse *fuse_new_31(<span class="keyword">struct</span> <a class="code" href="structfuse__args.html">fuse_args</a> *args,</div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__operations.html">fuse_operations</a> *op,</div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>  <span class="keywordtype">size_t</span> op_size, <span class="keywordtype">void</span> *user_data)</div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span> {</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>  <span class="keyword">struct </span>fuse *f;</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>  <span class="keyword">struct </span>node *root;</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>  <span class="keyword">struct </span>fuse_fs *fs;</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>  <span class="keyword">struct </span><a class="code" href="structfuse__lowlevel__ops.html">fuse_lowlevel_ops</a> llop = fuse_path_ops;</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span> </div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>  f = (<span class="keyword">struct </span>fuse *) calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse));</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>  <span class="keywordflow">if</span> (f == NULL) {</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>  fprintf(stderr, <span class="stringliteral">"fuse: failed to allocate fuse object\n"</span>);</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>  }</div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span> </div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>  f->conf.entry_timeout = 1.0;</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>  f->conf.attr_timeout = 1.0;</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>  f->conf.negative_timeout = 0.0;</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>  f->conf.intr_signal = FUSE_DEFAULT_INTR_SIGNAL;</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span> </div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>  <span class="comment">/* Parse options */</span></div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__opt_8h.html#a539ef1f571c34f516c60c4cbe2901c0e">fuse_opt_parse</a>(args, &f->conf, fuse_lib_opts,</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>  fuse_lib_opt_proc) == -1)</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span> </div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>  pthread_mutex_lock(&fuse_context_lock);</div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>  <span class="keyword">static</span> <span class="keywordtype">int</span> builtin_modules_registered = 0;</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>  <span class="comment">/* Have the builtin modules already been registered? */</span></div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>  <span class="keywordflow">if</span> (builtin_modules_registered == 0) {</div><div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>  <span class="comment">/* If not, register them. */</span></div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>  fuse_register_module(<span class="stringliteral">"subdir"</span>, fuse_module_subdir_factory, NULL);</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span> <span class="preprocessor">#ifdef HAVE_ICONV</span></div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>  fuse_register_module(<span class="stringliteral">"iconv"</span>, fuse_module_iconv_factory, NULL);</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>  builtin_modules_registered= 1;</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>  }</div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>  pthread_mutex_unlock(&fuse_context_lock);</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span> </div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>  <span class="keywordflow">if</span> (fuse_create_context_key() == -1)</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l04868"></a><span class="lineno"> 4868</span> </div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>  fs = <a class="code" href="fuse_8h.html#a74883ac07b1794da7affbd95251d25d7">fuse_fs_new</a>(op, op_size, user_data);</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>  <span class="keywordflow">if</span> (!fs)</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>  <span class="keywordflow">goto</span> out_delete_context_key;</div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span> </div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>  f->fs = fs;</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span> </div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>  <span class="comment">/* Oh f**k, this is ugly! */</span></div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>  <span class="keywordflow">if</span> (!fs->op.lock) {</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>  llop.<a class="code" href="structfuse__lowlevel__ops.html#ad5cdd0ad2881d6893671ff8d7929afea">getlk</a> = NULL;</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>  llop.<a class="code" href="structfuse__lowlevel__ops.html#aaa5d0b2dd7f3ba02c5cd514a470fbd35">setlk</a> = NULL;</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>  }</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span> </div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>  f->pagesize = getpagesize();</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>  init_list_head(&f->partial_slabs);</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>  init_list_head(&f->full_slabs);</div><div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>  init_list_head(&f->lru_table);</div><div class="line"><a name="l04885"></a><span class="lineno"> 4885</span> </div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>  <span class="keywordflow">if</span> (f->conf.modules) {</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>  <span class="keywordtype">char</span> *module;</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>  <span class="keywordtype">char</span> *next;</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span> </div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>  <span class="keywordflow">for</span> (module = f->conf.modules; module; module = next) {</div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>  <span class="keywordtype">char</span> *p;</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>  <span class="keywordflow">for</span> (p = module; *p && *p != <span class="charliteral">':'</span>; p++);</div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>  next = *p ? p + 1 : NULL;</div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>  *p = <span class="charliteral">'\0'</span>;</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>  <span class="keywordflow">if</span> (module[0] &&</div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>  fuse_push_module(f, module, args) == -1)</div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>  <span class="keywordflow">goto</span> out_free_fs;</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>  }</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>  }</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span> </div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>  <span class="keywordflow">if</span> (!f->conf.ac_attr_timeout_set)</div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>  f->conf.ac_attr_timeout = f->conf.attr_timeout;</div><div class="line"><a name="l04903"></a><span class="lineno"> 4903</span> </div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span> <span class="preprocessor">#if defined(__FreeBSD__) || defined(__NetBSD__)</span></div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>  <span class="comment">/*</span></div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span> <span class="comment"> * In FreeBSD, we always use these settings as inode numbers</span></div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span> <span class="comment"> * are needed to make getcwd(3) work.</span></div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span> <span class="comment"> */</span></div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>  f->conf.readdir_ino = 1;</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l04911"></a><span class="lineno"> 4911</span> </div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>  f->se = <a class="code" href="fuse__lowlevel_8h.html#a9ee52f81d0c63d9bd46b11314ba596cf">fuse_session_new</a>(args, &llop, <span class="keyword">sizeof</span>(llop), f);</div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>  <span class="keywordflow">if</span> (f->se == NULL)</div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>  <span class="keywordflow">goto</span> out_free_fs;</div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span> </div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>  <span class="keywordflow">if</span> (f->conf.debug) {</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>  fprintf(stderr, <span class="stringliteral">"nullpath_ok: %i\n"</span>, f->conf.nullpath_ok);</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>  }</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span> </div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>  <span class="comment">/* Trace topmost layer by default */</span></div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>  f->fs->debug = f->conf.debug;</div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>  f->ctr = 0;</div><div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>  f->generation = 0;</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>  <span class="keywordflow">if</span> (node_table_init(&f->name_table) == -1)</div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>  <span class="keywordflow">goto</span> out_free_session;</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span> </div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>  <span class="keywordflow">if</span> (node_table_init(&f->id_table) == -1)</div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>  <span class="keywordflow">goto</span> out_free_name_table;</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span> </div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>  fuse_mutex_init(&f->lock);</div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span> </div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>  root = alloc_node(f);</div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>  <span class="keywordflow">if</span> (root == NULL) {</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>  fprintf(stderr, <span class="stringliteral">"fuse: memory allocation failed\n"</span>);</div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>  <span class="keywordflow">goto</span> out_free_id_table;</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>  }</div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>  <span class="keywordflow">if</span> (lru_enabled(f)) {</div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>  <span class="keyword">struct </span>node_lru *lnode = node_lru(root);</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>  init_list_head(&lnode->lru);</div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>  }</div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span> </div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>  strcpy(root->inline_name, <span class="stringliteral">"/"</span>);</div><div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>  root->name = root->inline_name;</div><div class="line"><a name="l04944"></a><span class="lineno"> 4944</span> </div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>  <span class="keywordflow">if</span> (f->conf.intr &&</div><div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>  fuse_init_intr_signal(f->conf.intr_signal,</div><div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>  &f->intr_installed) == -1)</div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>  <span class="keywordflow">goto</span> out_free_root;</div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span> </div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>  root->parent = NULL;</div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>  root->nodeid = <a class="code" href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a>;</div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>  inc_nlookup(root);</div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>  hash_id(f, root);</div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span> </div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>  <span class="keywordflow">return</span> f;</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span> </div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span> out_free_root:</div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>  free(root);</div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span> out_free_id_table:</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>  free(f->id_table.array);</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span> out_free_name_table:</div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>  free(f->name_table.array);</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span> out_free_session:</div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>  <a class="code" href="fuse__lowlevel_8h.html#a08b5503c4e9656f9c4bc88331233cc65">fuse_session_destroy</a>(f->se);</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span> out_free_fs:</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>  <span class="keywordflow">if</span> (f->fs->m)</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>  fuse_put_module(f->fs->m);</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>  free(f->fs);</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>  free(f->conf.modules);</div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span> out_delete_context_key:</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>  fuse_delete_context_key();</div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span> out_free:</div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>  free(f);</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span> out:</div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span> }</div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span> </div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span> <span class="comment">/* Emulates 3.0-style fuse_new(), which processes --help */</span></div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span> <span class="keyword">struct </span>fuse *fuse_new_30(<span class="keyword">struct</span> <a class="code" href="structfuse__args.html">fuse_args</a> *args, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__operations.html">fuse_operations</a> *op,</div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>  <span class="keywordtype">size_t</span> op_size, <span class="keywordtype">void</span> *private_data);</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span> FUSE_SYMVER(<span class="stringliteral">".symver fuse_new_30,fuse_new@FUSE_3.0"</span>);</div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span> <span class="keyword">struct </span>fuse *fuse_new_30(<span class="keyword">struct</span> <a class="code" href="structfuse__args.html">fuse_args</a> *args,</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__operations.html">fuse_operations</a> *op,</div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>  <span class="keywordtype">size_t</span> op_size, <span class="keywordtype">void</span> *user_data)</div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span> {</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>  <span class="keyword">struct </span><a class="code" href="structfuse__config.html">fuse_config</a> conf;</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span> </div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>  memset(&conf, 0, <span class="keyword">sizeof</span>(conf));</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span> </div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structfuse__opt.html">fuse_opt</a> opts[] = {</div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>  FUSE_LIB_OPT(<span class="stringliteral">"-h"</span>, show_help, 1),</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>  FUSE_LIB_OPT(<span class="stringliteral">"--help"</span>, show_help, 1),</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>  <a class="code" href="fuse__opt_8h.html#aca35962e17d189ceb5447f8eea11bd33">FUSE_OPT_END</a></div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>  };</div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span> </div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse__opt_8h.html#a539ef1f571c34f516c60c4cbe2901c0e">fuse_opt_parse</a>(args, &conf, opts,</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>  fuse_lib_opt_proc) == -1)</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span> </div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>  <span class="keywordflow">if</span> (conf.<a class="code" href="structfuse__config.html#af55edfc4d69e0042146fbd03c26ded3a">show_help</a>) {</div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>  <a class="code" href="fuse_8h.html#a9cef8443ae22c4bcc800d7c45f1496fe">fuse_lib_help</a>(args);</div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>  <span class="keywordflow">return</span> fuse_new_31(args, op, op_size, user_data);</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span> }</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span> </div><div class="line"><a name="l05007"></a><span class="lineno"><a class="line" href="fuse_8h.html#a0d47cac8a295efd5370d7af059e4d14f"> 5007</a></span> <span class="keywordtype">void</span> <a class="code" href="fuse_8h.html#a0d47cac8a295efd5370d7af059e4d14f">fuse_destroy</a>(<span class="keyword">struct</span> fuse *f)</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span> {</div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>  <span class="keywordtype">size_t</span> i;</div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span> </div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>  <span class="keywordflow">if</span> (f->conf.intr && f->intr_installed)</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>  fuse_restore_intr_signal(f->conf.intr_signal);</div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span> </div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>  <span class="keywordflow">if</span> (f->fs) {</div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>  fuse_create_context(f);</div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span> </div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>  <span class="keywordflow">for</span> (i = 0; i < f->id_table.size; i++) {</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span> </div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>  <span class="keywordflow">for</span> (node = f->id_table.array[i]; node != NULL;</div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>  node = node->id_next) {</div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>  <span class="keywordflow">if</span> (node->is_hidden) {</div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>  <span class="keywordtype">char</span> *path;</div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>  <span class="keywordflow">if</span> (try_get_path(f, node->nodeid, NULL, &path, NULL, <span class="keyword">false</span>) == 0) {</div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>  fuse_fs_unlink(f->fs, path);</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>  free(path);</div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>  }</div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>  }</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>  }</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>  }</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>  }</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>  <span class="keywordflow">for</span> (i = 0; i < f->id_table.size; i++) {</div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>  <span class="keyword">struct </span>node *node;</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>  <span class="keyword">struct </span>node *next;</div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span> </div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>  <span class="keywordflow">for</span> (node = f->id_table.array[i]; node != NULL; node = next) {</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>  next = node->id_next;</div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>  free_node(f, node);</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>  f->id_table.use--;</div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>  }</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>  }</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>  assert(list_empty(&f->partial_slabs));</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>  assert(list_empty(&f->full_slabs));</div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span> </div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>  <span class="keywordflow">while</span> (fuse_modules) {</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>  fuse_put_module(fuse_modules);</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>  }</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>  free(f->id_table.array);</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>  free(f->name_table.array);</div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>  pthread_mutex_destroy(&f->lock);</div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>  <a class="code" href="fuse__lowlevel_8h.html#a08b5503c4e9656f9c4bc88331233cc65">fuse_session_destroy</a>(f->se);</div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>  free(f->conf.modules);</div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>  free(f);</div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>  fuse_delete_context_key();</div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span> }</div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span> </div><div class="line"><a name="l05057"></a><span class="lineno"><a class="line" href="fuse_8h.html#a04baffd979b06663ae9590e34a48b55f"> 5057</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse_8h.html#a04baffd979b06663ae9590e34a48b55f">fuse_mount</a>(<span class="keyword">struct</span> fuse *f, <span class="keyword">const</span> <span class="keywordtype">char</span> *mountpoint) {</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>  <span class="keywordflow">return</span> <a class="code" href="fuse__lowlevel_8h.html#aa6d77679a110582684e9ca2da623bbc2">fuse_session_mount</a>(<a class="code" href="fuse_8h.html#a03baa193b5bfcbe625afbc62e9b97e91">fuse_get_session</a>(f), mountpoint);</div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span> }</div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span> </div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span> </div><div class="line"><a name="l05062"></a><span class="lineno"><a class="line" href="fuse_8h.html#aade4d93e323c341fe2859d759e9cb8d8"> 5062</a></span> <span class="keywordtype">void</span> <a class="code" href="fuse_8h.html#aade4d93e323c341fe2859d759e9cb8d8">fuse_unmount</a>(<span class="keyword">struct</span> fuse *f) {</div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>  <span class="keywordflow">return</span> <a class="code" href="fuse__lowlevel_8h.html#a6c10d942751ddb214863a8b5e53de5e8">fuse_session_unmount</a>(<a class="code" href="fuse_8h.html#a03baa193b5bfcbe625afbc62e9b97e91">fuse_get_session</a>(f));</div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span> }</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span> </div><div class="line"><a name="l05066"></a><span class="lineno"><a class="line" href="fuse__common_8h.html#ae04b2f721003f5540c71be65396c53c8"> 5066</a></span> <span class="keywordtype">int</span> <a class="code" href="fuse__common_8h.html#ae04b2f721003f5540c71be65396c53c8">fuse_version</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span> {</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>  <span class="keywordflow">return</span> FUSE_VERSION;</div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span> }</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span> </div><div class="line"><a name="l05071"></a><span class="lineno"><a class="line" href="fuse__common_8h.html#ac52e27388a7c16eb509173908e5eebd0"> 5071</a></span> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="fuse__common_8h.html#ac52e27388a7c16eb509173908e5eebd0">fuse_pkgversion</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span> {</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>  <span class="keywordflow">return</span> PACKAGE_VERSION;</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span> }</div><div class="ttc" id="fuse__lowlevel_8h_html_a08b5503c4e9656f9c4bc88331233cc65"><div class="ttname"><a href="fuse__lowlevel_8h.html#a08b5503c4e9656f9c4bc88331233cc65">fuse_session_destroy</a></div><div class="ttdeci">void fuse_session_destroy(struct fuse_session *se)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02621">fuse_lowlevel.c:2621</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a2553c03f9a63c75e609e67f90a3a5d88"><div class="ttname"><a href="fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a></div><div class="ttdeci">int fuse_reply_err(fuse_req_t req, int err)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00312">fuse_lowlevel.c:312</a></div></div>
<div class="ttc" id="structfuse__bufvec_html_a0fbb583168d52562f0f848562ecf63bc"><div class="ttname"><a href="structfuse__bufvec.html#a0fbb583168d52562f0f848562ecf63bc">fuse_bufvec::off</a></div><div class="ttdeci">size_t off</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00679">fuse_common.h:679</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a9ee52f81d0c63d9bd46b11314ba596cf"><div class="ttname"><a href="fuse__lowlevel_8h.html#a9ee52f81d0c63d9bd46b11314ba596cf">fuse_session_new</a></div><div class="ttdeci">struct fuse_session * fuse_session_new(struct fuse_args *args, const struct fuse_lowlevel_ops *op, size_t op_size, void *userdata)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02809">fuse_lowlevel.c:2809</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a198429f3fbc23ef29ef9971271827690"><div class="ttname"><a href="fuse__lowlevel_8h.html#a198429f3fbc23ef29ef9971271827690">fuse_session_exit</a></div><div class="ttdeci">void fuse_session_exit(struct fuse_session *se)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l03037">fuse_lowlevel.c:3037</a></div></div>
<div class="ttc" id="structfuse__conn__info_html_a8a1c61f5d7cc14249fb6971165bb958e"><div class="ttname"><a href="structfuse__conn__info.html#a8a1c61f5d7cc14249fb6971165bb958e">fuse_conn_info::capable</a></div><div class="ttdeci">unsigned capable</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00381">fuse_common.h:381</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a45314d0b92a8d4c9de33d996aa59ada8"><div class="ttname"><a href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fuse_file_info::fh</a></div><div class="ttdeci">uint64_t fh</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00072">fuse_common.h:72</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a5f1e538aa3287e251afbe985438c4249"><div class="ttname"><a href="fuse__lowlevel_8h.html#a5f1e538aa3287e251afbe985438c4249">fuse_session_loop</a></div><div class="ttdeci">int fuse_session_loop(struct fuse_session *se)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__loop_8c_source.html#l00019">fuse_loop.c:19</a></div></div>
<div class="ttc" id="fuse_8h_html_af1d0194d186240ef6aaf6e9bf8568568a3f50d11935fe96eb4df6ff0844c4e153"><div class="ttname"><a href="fuse_8h.html#af1d0194d186240ef6aaf6e9bf8568568a3f50d11935fe96eb4df6ff0844c4e153">FUSE_FILL_DIR_PLUS</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00064">fuse.h:64</a></div></div>
<div class="ttc" id="structfuse__conn__info_html"><div class="ttname"><a href="structfuse__conn__info.html">fuse_conn_info</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00343">fuse_common.h:343</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a984187caa62aafc15abf9ff621667f3d"><div class="ttname"><a href="structfuse__file__info.html#a984187caa62aafc15abf9ff621667f3d">fuse_file_info::writepage</a></div><div class="ttdeci">unsigned int writepage</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00043">fuse_common.h:43</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_adf7f34f470c04f276b7091ad3b3dcb31"><div class="ttname"><a href="fuse__lowlevel_8h.html#adf7f34f470c04f276b7091ad3b3dcb31">fuse_reply_ioctl</a></div><div class="ttdeci">int fuse_reply_ioctl(fuse_req_t req, int result, const void *buf, size_t size)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00979">fuse_lowlevel.c:979</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a990af0becaba1b5e45781d399720f85e"><div class="ttname"><a href="fuse__lowlevel_8h.html#a990af0becaba1b5e45781d399720f85e">fuse_lowlevel_help</a></div><div class="ttdeci">void fuse_lowlevel_help(void)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02611">fuse_lowlevel.c:2611</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a03b59a10e62963d9affa34ad78bd144a"><div class="ttname"><a href="structfuse__file__info.html#a03b59a10e62963d9affa34ad78bd144a">fuse_file_info::direct_io</a></div><div class="ttdeci">unsigned int direct_io</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00046">fuse_common.h:46</a></div></div>
<div class="ttc" id="fuse__common_8h_html_a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b"><div class="ttname"><a href="fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00555">fuse_common.h:555</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a34f3f1beebacab5f717d95baf832a8a5"><div class="ttname"><a href="fuse__lowlevel_8h.html#a34f3f1beebacab5f717d95baf832a8a5">fuse_add_direntry_plus</a></div><div class="ttdeci">size_t fuse_add_direntry_plus(fuse_req_t req, char *buf, size_t bufsize, const char *name, const struct fuse_entry_param *e, off_t off)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00357">fuse_lowlevel.c:357</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a1242694fe0fb6e253a88b57795987302"><div class="ttname"><a href="fuse__lowlevel_8h.html#a1242694fe0fb6e253a88b57795987302">fuse_reply_data</a></div><div class="ttdeci">int fuse_reply_data(fuse_req_t req, struct fuse_bufvec *bufv, enum fuse_buf_copy_flags flags)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00820">fuse_lowlevel.c:820</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a51b0d5928ec6112456d2aa50f2c35001"><div class="ttname"><a href="structfuse__file__info.html#a51b0d5928ec6112456d2aa50f2c35001">fuse_file_info::poll_events</a></div><div class="ttdeci">uint32_t poll_events</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00079">fuse_common.h:79</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_ad1d1963190eb93ae5667d32d2b387ca1"><div class="ttname"><a href="fuse__lowlevel_8h.html#ad1d1963190eb93ae5667d32d2b387ca1">fuse_req_ctx</a></div><div class="ttdeci">const struct fuse_ctx * fuse_req_ctx(fuse_req_t req)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02343">fuse_lowlevel.c:2343</a></div></div>
<div class="ttc" id="fuse_8h_html_ad37fd69ba40d5c261f16e207e4a5b0ed"><div class="ttname"><a href="fuse_8h.html#ad37fd69ba40d5c261f16e207e4a5b0ed">fuse_stop_cleanup_thread</a></div><div class="ttdeci">void fuse_stop_cleanup_thread(struct fuse *fuse)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04816">fuse.c:4816</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_aa6d77679a110582684e9ca2da623bbc2"><div class="ttname"><a href="fuse__lowlevel_8h.html#aa6d77679a110582684e9ca2da623bbc2">fuse_session_mount</a></div><div class="ttdeci">int fuse_session_mount(struct fuse_session *se, const char *mountpoint)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02903">fuse_lowlevel.c:2903</a></div></div>
<div class="ttc" id="structfuse__loop__config_html_ab9412a7c922432f6d3cdcfacb5aaa032"><div class="ttname"><a href="structfuse__loop__config.html#ab9412a7c922432f6d3cdcfacb5aaa032">fuse_loop_config::max_idle_threads</a></div><div class="ttdeci">unsigned int max_idle_threads</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00103">fuse_common.h:103</a></div></div>
<div class="ttc" id="structfuse__ctx_html_aa6932619b51a5bfe4d1362ac4c1d2ce8"><div class="ttname"><a href="structfuse__ctx.html#aa6932619b51a5bfe4d1362ac4c1d2ce8">fuse_ctx::umask</a></div><div class="ttdeci">mode_t umask</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00125">fuse_lowlevel.h:125</a></div></div>
<div class="ttc" id="fuse_8h_html_a6ea805c47ccc960497dfd64e12081159"><div class="ttname"><a href="fuse_8h.html#a6ea805c47ccc960497dfd64e12081159">fuse_loop</a></div><div class="ttdeci">int fuse_loop(struct fuse *f)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04516">fuse.c:4516</a></div></div>
<div class="ttc" id="fuse_8h_html_af1d0194d186240ef6aaf6e9bf8568568"><div class="ttname"><a href="fuse_8h.html#af1d0194d186240ef6aaf6e9bf8568568">fuse_fill_dir_flags</a></div><div class="ttdeci">fuse_fill_dir_flags</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00054">fuse.h:54</a></div></div>
<div class="ttc" id="fuse__opt_8h_html_a539ef1f571c34f516c60c4cbe2901c0e"><div class="ttname"><a href="fuse__opt_8h.html#a539ef1f571c34f516c60c4cbe2901c0e">fuse_opt_parse</a></div><div class="ttdeci">int fuse_opt_parse(struct fuse_args *args, void *data, const struct fuse_opt opts[], fuse_opt_proc_t proc)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8c_source.html#l00397">fuse_opt.c:397</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_ab078685b1f480188031fc40aa2e2fbca"><div class="ttname"><a href="fuse__lowlevel_8h.html#ab078685b1f480188031fc40aa2e2fbca">fuse_lowlevel_notify_poll</a></div><div class="ttdeci">int fuse_lowlevel_notify_poll(struct fuse_pollhandle *ph)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02124">fuse_lowlevel.c:2124</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a33e2aa4a8905a05397292ae047cd2257"><div class="ttname"><a href="fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a></div><div class="ttdeci">struct fuse_req * fuse_req_t</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00049">fuse_lowlevel.h:49</a></div></div>
<div class="ttc" id="structfuse__entry__param_html_adcdee37c96ad18380a47cdbe96a323b9"><div class="ttname"><a href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">fuse_entry_param::attr</a></div><div class="ttdeci">struct stat attr</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00091">fuse_lowlevel.h:91</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_ad1957bcc8ece8c90f16c42c4daf3053f"><div class="ttname"><a href="fuse__lowlevel_8h.html#ad1957bcc8ece8c90f16c42c4daf3053f">fuse_add_direntry</a></div><div class="ttdeci">size_t fuse_add_direntry(fuse_req_t req, char *buf, size_t bufsize, const char *name, const struct stat *stbuf, off_t off)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00267">fuse_lowlevel.c:267</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_aab00273c65d124e44abcf2374f9c504b"><div class="ttname"><a href="fuse__lowlevel_8h.html#aab00273c65d124e44abcf2374f9c504b">fuse_req_userdata</a></div><div class="ttdeci">void * fuse_req_userdata(fuse_req_t req)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02338">fuse_lowlevel.c:2338</a></div></div>
<div class="ttc" id="fuse__common_8h_html_aec0ad71a3e8c357ebe7e87cdecbdbe18af239e556066a5d73b3ff542216b157b9"><div class="ttname"><a href="fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18af239e556066a5d73b3ff542216b157b9">FUSE_BUF_SPLICE_MOVE</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00606">fuse_common.h:606</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a9cb974af9745294ff446d11cba2422f1"><div class="ttname"><a href="fuse__lowlevel_8h.html#a9cb974af9745294ff446d11cba2422f1">fuse_lowlevel_notify_inval_inode</a></div><div class="ttdeci">int fuse_lowlevel_notify_inval_inode(struct fuse_session *se, fuse_ino_t ino, off_t off, off_t len)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02141">fuse_lowlevel.c:2141</a></div></div>
<div class="ttc" id="structfuse__ctx_html_a056667c9ce324cb56b833e981aef8b5b"><div class="ttname"><a href="structfuse__ctx.html#a056667c9ce324cb56b833e981aef8b5b">fuse_ctx::pid</a></div><div class="ttdeci">pid_t pid</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00122">fuse_lowlevel.h:122</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a65431e8196e0533257acad767f7b074f"><div class="ttname"><a href="fuse__lowlevel_8h.html#a65431e8196e0533257acad767f7b074f">fuse_reply_bmap</a></div><div class="ttdeci">int fuse_reply_bmap(fuse_req_t req, uint64_t idx)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00881">fuse_lowlevel.c:881</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a23a64eaecbf83f99aba8ee79e6de2780"><div class="ttname"><a href="structfuse__file__info.html#a23a64eaecbf83f99aba8ee79e6de2780">fuse_file_info::keep_cache</a></div><div class="ttdeci">unsigned int keep_cache</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00051">fuse_common.h:51</a></div></div>
<div class="ttc" id="structfuse__entry__param_html"><div class="ttname"><a href="structfuse__entry__param.html">fuse_entry_param</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00059">fuse_lowlevel.h:59</a></div></div>
<div class="ttc" id="fuse_8h_html_af2bcf2a473b41b3cc8da8c079656a074"><div class="ttname"><a href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074">fuse_readdir_flags</a></div><div class="ttdeci">fuse_readdir_flags</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00042">fuse.h:42</a></div></div>
<div class="ttc" id="fuse__common_8h_html_a7686c11aaf80382189927b10b848d8c8"><div class="ttname"><a href="fuse__common_8h.html#a7686c11aaf80382189927b10b848d8c8">FUSE_CAP_EXPORT_SUPPORT</a></div><div class="ttdeci">#define FUSE_CAP_EXPORT_SUPPORT</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00144">fuse_common.h:144</a></div></div>
<div class="ttc" id="structfuse__entry__param_html_a285ba89754871772d940fa4fb736bce3"><div class="ttname"><a href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">fuse_entry_param::ino</a></div><div class="ttdeci">fuse_ino_t ino</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00067">fuse_lowlevel.h:67</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a3575f36b21f406c211c41c8c31323688"><div class="ttname"><a href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">fuse_file_info::lock_owner</a></div><div class="ttdeci">uint64_t lock_owner</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00075">fuse_common.h:75</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_afed32e5d3e1f54d390103f79ebb8bd42"><div class="ttname"><a href="fuse__lowlevel_8h.html#afed32e5d3e1f54d390103f79ebb8bd42">fuse_reply_xattr</a></div><div class="ttdeci">int fuse_reply_xattr(fuse_req_t req, size_t count)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00854">fuse_lowlevel.c:854</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a41b12193fa1520ff658d65679f4e513c"><div class="ttname"><a href="fuse__lowlevel_8h.html#a41b12193fa1520ff658d65679f4e513c">fuse_session_exited</a></div><div class="ttdeci">int fuse_session_exited(struct fuse_session *se)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l03048">fuse_lowlevel.c:3048</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a672c45e126cd240f4bcd59bf9b7e3708"><div class="ttname"><a href="fuse__lowlevel_8h.html#a672c45e126cd240f4bcd59bf9b7e3708">fuse_reply_entry</a></div><div class="ttdeci">int fuse_reply_entry(fuse_req_t req, const struct fuse_entry_param *e)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00399">fuse_lowlevel.c:399</a></div></div>
<div class="ttc" id="structfuse__lowlevel__ops_html_ad5cdd0ad2881d6893671ff8d7929afea"><div class="ttname"><a href="structfuse__lowlevel__ops.html#ad5cdd0ad2881d6893671ff8d7929afea">fuse_lowlevel_ops::getlk</a></div><div class="ttdeci">void(* getlk)(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, struct flock *lock)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00922">fuse_lowlevel.h:922</a></div></div>
<div class="ttc" id="fuse__opt_8h_html_a21602e6a0fff64fc9c7b642d12382094"><div class="ttname"><a href="fuse__opt_8h.html#a21602e6a0fff64fc9c7b642d12382094">fuse_opt_add_arg</a></div><div class="ttdeci">int fuse_opt_add_arg(struct fuse_args *args, const char *arg)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8c_source.html#l00054">fuse_opt.c:54</a></div></div>
<div class="ttc" id="structfuse__file__info_html"><div class="ttname"><a href="structfuse__file__info.html">fuse_file_info</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00037">fuse_common.h:37</a></div></div>
<div class="ttc" id="fuse_8h_html_a90f104e6d4e01480161a3300bddbecbe"><div class="ttname"><a href="fuse_8h.html#a90f104e6d4e01480161a3300bddbecbe">fuse_clean_cache</a></div><div class="ttdeci">int fuse_clean_cache(struct fuse *fuse)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04373">fuse.c:4373</a></div></div>
<div class="ttc" id="structfuse__ctx_html_abf920c4533df81789fd284aa05ee5771"><div class="ttname"><a href="structfuse__ctx.html#abf920c4533df81789fd284aa05ee5771">fuse_ctx::uid</a></div><div class="ttdeci">uid_t uid</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00116">fuse_lowlevel.h:116</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a135eda9b7d36fb4eaae2de58526d4f85"><div class="ttname"><a href="fuse__lowlevel_8h.html#a135eda9b7d36fb4eaae2de58526d4f85">fuse_reply_lock</a></div><div class="ttdeci">int fuse_reply_lock(fuse_req_t req, const struct flock *lock)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00864">fuse_lowlevel.c:864</a></div></div>
<div class="ttc" id="fuse_8h_html_a0d47cac8a295efd5370d7af059e4d14f"><div class="ttname"><a href="fuse_8h.html#a0d47cac8a295efd5370d7af059e4d14f">fuse_destroy</a></div><div class="ttdeci">void fuse_destroy(struct fuse *f)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l05007">fuse.c:5007</a></div></div>
<div class="ttc" id="fuse__common_8h_html_ae04b2f721003f5540c71be65396c53c8"><div class="ttname"><a href="fuse__common_8h.html#ae04b2f721003f5540c71be65396c53c8">fuse_version</a></div><div class="ttdeci">int fuse_version(void)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l05066">fuse.c:5066</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a52674fc627647f33e63c74267f0f1f9d"><div class="ttname"><a href="fuse__lowlevel_8h.html#a52674fc627647f33e63c74267f0f1f9d">fuse_req_interrupted</a></div><div class="ttdeci">int fuse_req_interrupted(fuse_req_t req)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02361">fuse_lowlevel.c:2361</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_ab3d015de77ae0edeb3157321e7a5c434"><div class="ttname"><a href="fuse__lowlevel_8h.html#ab3d015de77ae0edeb3157321e7a5c434">fuse_session_reset</a></div><div class="ttdeci">void fuse_session_reset(struct fuse_session *se)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l03042">fuse_lowlevel.c:3042</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a85ae91390a6704dc26f8d80fed7d5678"><div class="ttname"><a href="fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a></div><div class="ttdeci">void fuse_reply_none(fuse_req_t req)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00317">fuse_lowlevel.c:317</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a57f4dabcf044aafcdba6c4682b3a1869"><div class="ttname"><a href="fuse__lowlevel_8h.html#a57f4dabcf044aafcdba6c4682b3a1869">fuse_req_getgroups</a></div><div class="ttdeci">int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[])</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l03030">fuse_lowlevel.c:3030</a></div></div>
<div class="ttc" id="structfuse__operations_html"><div class="ttname"><a href="structfuse__operations.html">fuse_operations</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00299">fuse.h:299</a></div></div>
<div class="ttc" id="structfuse__file__info_html_ae7d31802727be19670193a411647bca5"><div class="ttname"><a href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">fuse_file_info::flags</a></div><div class="ttdeci">int flags</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00039">fuse_common.h:39</a></div></div>
<div class="ttc" id="structfuse__bufvec_html"><div class="ttname"><a href="structfuse__bufvec.html">fuse_bufvec</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00665">fuse_common.h:665</a></div></div>
<div class="ttc" id="structfuse__loop__config_html"><div class="ttname"><a href="structfuse__loop__config.html">fuse_loop_config</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00086">fuse_common.h:86</a></div></div>
<div class="ttc" id="structfuse__bufvec_html_a41cc18cb303ee16d20b3ae1ebb0ef830"><div class="ttname"><a href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">fuse_bufvec::idx</a></div><div class="ttdeci">size_t idx</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00674">fuse_common.h:674</a></div></div>
<div class="ttc" id="structfuse__ctx_html"><div class="ttname"><a href="structfuse__ctx.html">fuse_ctx</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00114">fuse_lowlevel.h:114</a></div></div>
<div class="ttc" id="structfuse__bufvec_html_ac303661a9c39ade1feeb05d8238b4ed6"><div class="ttname"><a href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">fuse_bufvec::count</a></div><div class="ttdeci">size_t count</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00669">fuse_common.h:669</a></div></div>
<div class="ttc" id="fuse__opt_8h_html"><div class="ttname"><a href="fuse__opt_8h.html">fuse_opt.h</a></div></div>
<div class="ttc" id="fuse__opt_8h_html_a371d830a8aedd9e3f96d9bb31876a8f1"><div class="ttname"><a href="fuse__opt_8h.html#a371d830a8aedd9e3f96d9bb31876a8f1">FUSE_OPT_KEY</a></div><div class="ttdeci">#define FUSE_OPT_KEY(templ, key)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8h_source.html#l00098">fuse_opt.h:98</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_ad28378dc569019c32acdb4995d70be18"><div class="ttname"><a href="fuse__lowlevel_8h.html#ad28378dc569019c32acdb4995d70be18">fuse_reply_attr</a></div><div class="ttdeci">int fuse_reply_attr(fuse_req_t req, const struct stat *attr, double attr_timeout)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00431">fuse_lowlevel.c:431</a></div></div>
<div class="ttc" id="fuse__common_8h_html_a2f8a51bc70841ab691660413836a9a14"><div class="ttname"><a href="fuse__common_8h.html#a2f8a51bc70841ab691660413836a9a14">FUSE_CAP_SPLICE_READ</a></div><div class="ttdeci">#define FUSE_CAP_SPLICE_READ</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00177">fuse_common.h:177</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a6c10d942751ddb214863a8b5e53de5e8"><div class="ttname"><a href="fuse__lowlevel_8h.html#a6c10d942751ddb214863a8b5e53de5e8">fuse_session_unmount</a></div><div class="ttdeci">void fuse_session_unmount(struct fuse_session *se)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02958">fuse_lowlevel.c:2958</a></div></div>
<div class="ttc" id="fuse__opt_8h_html_aca35962e17d189ceb5447f8eea11bd33"><div class="ttname"><a href="fuse__opt_8h.html#aca35962e17d189ceb5447f8eea11bd33">FUSE_OPT_END</a></div><div class="ttdeci">#define FUSE_OPT_END</div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8h_source.html#l00104">fuse_opt.h:104</a></div></div>
<div class="ttc" id="structfuse__buf_html_a1928e204554f2d37cb8dac28a8a2f28c"><div class="ttname"><a href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">fuse_buf::flags</a></div><div class="ttdeci">enum fuse_buf_flags flags</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00633">fuse_common.h:633</a></div></div>
<div class="ttc" id="fuse_8h_html_ab92480001ec4f475a082cbd32bee94e2"><div class="ttname"><a href="fuse_8h.html#ab92480001ec4f475a082cbd32bee94e2">fuse_module_factory_t</a></div><div class="ttdeci">struct fuse_fs *(* fuse_module_factory_t)(struct fuse_args *args, struct fuse_fs *fs[])</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l01226">fuse.h:1226</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_aa1d95ec3ca674253baac3639ea10f0ff"><div class="ttname"><a href="fuse__lowlevel_8h.html#aa1d95ec3ca674253baac3639ea10f0ff">fuse_reply_statfs</a></div><div class="ttdeci">int fuse_reply_statfs(fuse_req_t req, const struct statvfs *stbuf)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00842">fuse_lowlevel.c:842</a></div></div>
<div class="ttc" id="fuse_8h_html_a03baa193b5bfcbe625afbc62e9b97e91"><div class="ttname"><a href="fuse_8h.html#a03baa193b5bfcbe625afbc62e9b97e91">fuse_get_session</a></div><div class="ttdeci">struct fuse_session * fuse_get_session(struct fuse *f)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04459">fuse.c:4459</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a9c1571cb4b6be75827f48aac5891606c"><div class="ttname"><a href="structfuse__file__info.html#a9c1571cb4b6be75827f48aac5891606c">fuse_file_info::flush</a></div><div class="ttdeci">unsigned int flush</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00056">fuse_common.h:56</a></div></div>
<div class="ttc" id="fuse__opt_8h_html_a8533ff341f910c1bd05f10c8fcc35a04"><div class="ttname"><a href="fuse__opt_8h.html#a8533ff341f910c1bd05f10c8fcc35a04">FUSE_OPT_KEY_KEEP</a></div><div class="ttdeci">#define FUSE_OPT_KEY_KEEP</div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8h_source.html#l00145">fuse_opt.h:145</a></div></div>
<div class="ttc" id="structfuse__context_html_a198911619cb8ee1a0b11302b94b6027e"><div class="ttname"><a href="structfuse__context.html#a198911619cb8ee1a0b11302b94b6027e">fuse_context::private_data</a></div><div class="ttdeci">void * private_data</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00791">fuse.h:791</a></div></div>
<div class="ttc" id="fuse_8h_html_a56c1dfbdfaf10818dbc6c2ca6264f19a"><div class="ttname"><a href="fuse_8h.html#a56c1dfbdfaf10818dbc6c2ca6264f19a">fuse_invalidate_path</a></div><div class="ttdeci">int fuse_invalidate_path(struct fuse *f, const char *path)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04586">fuse.c:4586</a></div></div>
<div class="ttc" id="fuse_8h_html_af2bcf2a473b41b3cc8da8c079656a074ad62ab7c23f966a76282921e9187ca441"><div class="ttname"><a href="fuse_8h.html#af2bcf2a473b41b3cc8da8c079656a074ad62ab7c23f966a76282921e9187ca441">FUSE_READDIR_PLUS</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00051">fuse.h:51</a></div></div>
<div class="ttc" id="fuse_8h_html_a74883ac07b1794da7affbd95251d25d7"><div class="ttname"><a href="fuse_8h.html#a74883ac07b1794da7affbd95251d25d7">fuse_fs_new</a></div><div class="ttdeci">struct fuse_fs * fuse_fs_new(const struct fuse_operations *op, size_t op_size, void *private_data)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04760">fuse.c:4760</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a14d7299559cf05272b838cfc6388ef91"><div class="ttname"><a href="fuse__lowlevel_8h.html#a14d7299559cf05272b838cfc6388ef91">FUSE_ROOT_ID</a></div><div class="ttdeci">#define FUSE_ROOT_ID</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00043">fuse_lowlevel.h:43</a></div></div>
<div class="ttc" id="fuse_8h_html_a4b2246caec521ec4ac84093f8c4b616d"><div class="ttname"><a href="fuse_8h.html#a4b2246caec521ec4ac84093f8c4b616d">fuse_start_cleanup_thread</a></div><div class="ttdeci">int fuse_start_cleanup_thread(struct fuse *fuse)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04808">fuse.c:4808</a></div></div>
<div class="ttc" id="structfuse__module_html"><div class="ttname"><a href="structfuse__module.html">fuse_module</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__i_8h_source.html#l00082">fuse_i.h:82</a></div></div>
<div class="ttc" id="fuse__common_8h_html_afd06393448dbb60668f5a3bf0006f536"><div class="ttname"><a href="fuse__common_8h.html#afd06393448dbb60668f5a3bf0006f536">FUSE_CAP_FLOCK_LOCKS</a></div><div class="ttdeci">#define FUSE_CAP_FLOCK_LOCKS</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00190">fuse_common.h:190</a></div></div>
<div class="ttc" id="fuse_8h_html_a9cef8443ae22c4bcc800d7c45f1496fe"><div class="ttname"><a href="fuse_8h.html#a9cef8443ae22c4bcc800d7c45f1496fe">fuse_lib_help</a></div><div class="ttdeci">void fuse_lib_help(struct fuse_args *args)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04650">fuse.c:4650</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_ad119a72f00b4cd2e4a500fd3364ae1e2"><div class="ttname"><a href="fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a></div><div class="ttdeci">uint64_t fuse_ino_t</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00046">fuse_lowlevel.h:46</a></div></div>
<div class="ttc" id="fuse_8h_html_a0514ca828e6a02a330dcf037292c8803"><div class="ttname"><a href="fuse_8h.html#a0514ca828e6a02a330dcf037292c8803">fuse_interrupted</a></div><div class="ttdeci">int fuse_interrupted(void)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04576">fuse.c:4576</a></div></div>
<div class="ttc" id="fuse_8h_html_a7dd132de66a5cc2add2a4eff5d435660"><div class="ttname"><a href="fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660">fuse_fill_dir_t</a></div><div class="ttdeci">int(* fuse_fill_dir_t)(void *buf, const char *name, const struct stat *stbuf, off_t off, enum fuse_fill_dir_flags flags)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00082">fuse.h:82</a></div></div>
<div class="ttc" id="structfuse__config_html_af55edfc4d69e0042146fbd03c26ded3a"><div class="ttname"><a href="structfuse__config.html#af55edfc4d69e0042146fbd03c26ded3a">fuse_config::show_help</a></div><div class="ttdeci">int show_help</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00271">fuse.h:271</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_ab3cdb9744f033e37a72984489343940f"><div class="ttname"><a href="fuse__lowlevel_8h.html#ab3cdb9744f033e37a72984489343940f">fuse_req_interrupt_func</a></div><div class="ttdeci">void fuse_req_interrupt_func(fuse_req_t req, fuse_interrupt_func_t func, void *data)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l02348">fuse_lowlevel.c:2348</a></div></div>
<div class="ttc" id="structfuse__entry__param_html_a4c673ec62c76f7d63d326407beb1b463"><div class="ttname"><a href="structfuse__entry__param.html#a4c673ec62c76f7d63d326407beb1b463">fuse_entry_param::generation</a></div><div class="ttdeci">uint64_t generation</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00082">fuse_lowlevel.h:82</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_abea78d22349198f8370d7cb91fbf05ed"><div class="ttname"><a href="fuse__lowlevel_8h.html#abea78d22349198f8370d7cb91fbf05ed">fuse_reply_create</a></div><div class="ttdeci">int fuse_reply_create(fuse_req_t req, const struct fuse_entry_param *e, const struct fuse_file_info *fi)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00415">fuse_lowlevel.c:415</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_aa3cfa73f61d6ef461ab5a3fbf859eb97"><div class="ttname"><a href="fuse__lowlevel_8h.html#aa3cfa73f61d6ef461ab5a3fbf859eb97">fuse_reply_write</a></div><div class="ttdeci">int fuse_reply_write(fuse_req_t req, size_t count)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00460">fuse_lowlevel.c:460</a></div></div>
<div class="ttc" id="structfuse__buf_html_a537f80b7703cbfc860dfaf4b86de79ae"><div class="ttname"><a href="structfuse__buf.html#a537f80b7703cbfc860dfaf4b86de79ae">fuse_buf::mem</a></div><div class="ttdeci">void * mem</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00640">fuse_common.h:640</a></div></div>
<div class="ttc" id="fuse_8h_html_a04273db088e57d8242caa388193b6958"><div class="ttname"><a href="fuse_8h.html#a04273db088e57d8242caa388193b6958">fuse_getgroups</a></div><div class="ttdeci">int fuse_getgroups(int size, gid_t list[])</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04567">fuse.c:4567</a></div></div>
<div class="ttc" id="structfuse__config_html"><div class="ttname"><a href="structfuse__config.html">fuse_config</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00093">fuse.h:93</a></div></div>
<div class="ttc" id="fuse_8h_html_a04baffd979b06663ae9590e34a48b55f"><div class="ttname"><a href="fuse_8h.html#a04baffd979b06663ae9590e34a48b55f">fuse_mount</a></div><div class="ttdeci">int fuse_mount(struct fuse *f, const char *mountpoint)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l05057">fuse.c:5057</a></div></div>
<div class="ttc" id="fuse__common_8h_html_a76f6b481e6a7c519fea9250daef6177a"><div class="ttname"><a href="fuse__common_8h.html#a76f6b481e6a7c519fea9250daef6177a">FUSE_CAP_POSIX_LOCKS</a></div><div class="ttdeci">#define FUSE_CAP_POSIX_LOCKS</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00128">fuse_common.h:128</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a170f8c6b953d70928e83bcecee43bfdc"><div class="ttname"><a href="fuse__lowlevel_8h.html#a170f8c6b953d70928e83bcecee43bfdc">fuse_reply_open</a></div><div class="ttdeci">int fuse_reply_open(fuse_req_t req, const struct fuse_file_info *fi)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00451">fuse_lowlevel.c:451</a></div></div>
<div class="ttc" id="structfuse__lowlevel__ops_html_aaa5d0b2dd7f3ba02c5cd514a470fbd35"><div class="ttname"><a href="structfuse__lowlevel__ops.html#aaa5d0b2dd7f3ba02c5cd514a470fbd35">fuse_lowlevel_ops::setlk</a></div><div class="ttdeci">void(* setlk)(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, struct flock *lock, int sleep)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00947">fuse_lowlevel.h:947</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html"><div class="ttname"><a href="fuse__lowlevel_8h.html">fuse_lowlevel.h</a></div></div>
<div class="ttc" id="structfuse__lowlevel__ops_html"><div class="ttname"><a href="structfuse__lowlevel__ops.html">fuse_lowlevel_ops</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00175">fuse_lowlevel.h:175</a></div></div>
<div class="ttc" id="structfuse__bufvec_html_a754caca61fdf8107d28b510505a033bb"><div class="ttname"><a href="structfuse__bufvec.html#a754caca61fdf8107d28b510505a033bb">fuse_bufvec::buf</a></div><div class="ttdeci">struct fuse_buf buf[1]</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00684">fuse_common.h:684</a></div></div>
<div class="ttc" id="structfuse__context_html"><div class="ttname"><a href="structfuse__context.html">fuse_context</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse_8h_source.html#l00777">fuse.h:777</a></div></div>
<div class="ttc" id="structfuse__opt_html"><div class="ttname"><a href="structfuse__opt.html">fuse_opt</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8h_source.html#l00077">fuse_opt.h:77</a></div></div>
<div class="ttc" id="structfuse__ctx_html_a923348304ee26adb3a43c31a4bac9583"><div class="ttname"><a href="structfuse__ctx.html#a923348304ee26adb3a43c31a4bac9583">fuse_ctx::gid</a></div><div class="ttdeci">gid_t gid</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00119">fuse_lowlevel.h:119</a></div></div>
<div class="ttc" id="structfuse__conn__info_html_af45de81548b591f3004353a324e4e04d"><div class="ttname"><a href="structfuse__conn__info.html#af45de81548b591f3004353a324e4e04d">fuse_conn_info::want</a></div><div class="ttdeci">unsigned want</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00389">fuse_common.h:389</a></div></div>
<div class="ttc" id="fuse_8h_html_aade4d93e323c341fe2859d759e9cb8d8"><div class="ttname"><a href="fuse_8h.html#aade4d93e323c341fe2859d759e9cb8d8">fuse_unmount</a></div><div class="ttdeci">void fuse_unmount(struct fuse *f)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l05062">fuse.c:5062</a></div></div>
<div class="ttc" id="structfuse__args_html"><div class="ttname"><a href="structfuse__args.html">fuse_args</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8h_source.html#l00109">fuse_opt.h:109</a></div></div>
<div class="ttc" id="fuse_8h_html_a8fb55dfd425856e0b10f4a2836e6f9f0"><div class="ttname"><a href="fuse_8h.html#a8fb55dfd425856e0b10f4a2836e6f9f0">fuse_loop_mt_31</a></div><div class="ttdeci">int fuse_loop_mt_31(struct fuse *f, int clone_fd)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04544">fuse.c:4544</a></div></div>
<div class="ttc" id="fuse__common_8h_html_ac52e27388a7c16eb509173908e5eebd0"><div class="ttname"><a href="fuse__common_8h.html#ac52e27388a7c16eb509173908e5eebd0">fuse_pkgversion</a></div><div class="ttdeci">const char * fuse_pkgversion(void)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l05071">fuse.c:5071</a></div></div>
<div class="ttc" id="fuse__opt_8h_html_a9bea40fe56b18be9aa110185ab7387ed"><div class="ttname"><a href="fuse__opt_8h.html#a9bea40fe56b18be9aa110185ab7387ed">FUSE_ARGS_INIT</a></div><div class="ttdeci">#define FUSE_ARGS_INIT(argc, argv)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__opt_8h_source.html#l00123">fuse_opt.h:123</a></div></div>
<div class="ttc" id="fuse__common_8h_html_a4327f41b2fe1ca84151b407169bd86c0"><div class="ttname"><a href="fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a></div><div class="ttdeci">size_t fuse_buf_size(const struct fuse_bufvec *bufv)</div><div class="ttdef"><b>Definition:</b> <a href="buffer_8c_source.html#l00022">buffer.c:22</a></div></div>
<div class="ttc" id="fuse__common_8h_html_a9ca301390fb5e85b85153abb1891a3f7"><div class="ttname"><a href="fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a></div><div class="ttdeci">ssize_t fuse_buf_copy(struct fuse_bufvec *dst, struct fuse_bufvec *src, enum fuse_buf_copy_flags flags)</div><div class="ttdef"><b>Definition:</b> <a href="buffer_8c_source.html#l00281">buffer.c:281</a></div></div>
<div class="ttc" id="structfuse__buf_html_afb58c1e18f434d1d4edb784d00e2e13d"><div class="ttname"><a href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">fuse_buf::size</a></div><div class="ttdeci">size_t size</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00628">fuse_common.h:628</a></div></div>
<div class="ttc" id="fuse_8h_html_a9a0f2a6603cb1e21f5e4c1aec84a3bcc"><div class="ttname"><a href="fuse_8h.html#a9a0f2a6603cb1e21f5e4c1aec84a3bcc">fuse_get_context</a></div><div class="ttdeci">struct fuse_context * fuse_get_context(void)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04557">fuse.c:4557</a></div></div>
<div class="ttc" id="structfuse__entry__param_html_a281b39b72e7ec574ba40d7341fd22c1d"><div class="ttname"><a href="structfuse__entry__param.html#a281b39b72e7ec574ba40d7341fd22c1d">fuse_entry_param::entry_timeout</a></div><div class="ttdeci">double entry_timeout</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00103">fuse_lowlevel.h:103</a></div></div>
<div class="ttc" id="structfuse__entry__param_html_aa797a9f4152cae506ba479af8bbe2eb7"><div class="ttname"><a href="structfuse__entry__param.html#aa797a9f4152cae506ba479af8bbe2eb7">fuse_entry_param::attr_timeout</a></div><div class="ttdeci">double attr_timeout</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00097">fuse_lowlevel.h:97</a></div></div>
<div class="ttc" id="structfuse__loop__config_html_a6a8527939446625e5466cd8baf399f08"><div class="ttname"><a href="structfuse__loop__config.html#a6a8527939446625e5466cd8baf399f08">fuse_loop_config::clone_fd</a></div><div class="ttdeci">int clone_fd</div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00091">fuse_common.h:91</a></div></div>
<div class="ttc" id="structfuse__buf_html"><div class="ttname"><a href="structfuse__buf.html">fuse_buf</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse__common_8h_source.html#l00624">fuse_common.h:624</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a5a5872d7f73f0bd593e00788a4c7bbb7"><div class="ttname"><a href="fuse__lowlevel_8h.html#a5a5872d7f73f0bd593e00788a4c7bbb7">fuse_reply_readlink</a></div><div class="ttdeci">int fuse_reply_readlink(fuse_req_t req, const char *link)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00446">fuse_lowlevel.c:446</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a300a88b63ab7c8ca92853a97486448c0"><div class="ttname"><a href="fuse__lowlevel_8h.html#a300a88b63ab7c8ca92853a97486448c0">fuse_reply_buf</a></div><div class="ttdeci">int fuse_reply_buf(fuse_req_t req, const char *buf, size_t size)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l00470">fuse_lowlevel.c:470</a></div></div>
<div class="ttc" id="structfuse__lowlevel__ops_html_aa8ed20e1d06c42a386404fba0d3e56b5"><div class="ttname"><a href="structfuse__lowlevel__ops.html#aa8ed20e1d06c42a386404fba0d3e56b5">fuse_lowlevel_ops::init</a></div><div class="ttdeci">void(* init)(void *userdata, struct fuse_conn_info *conn)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8h_source.html#l00192">fuse_lowlevel.h:192</a></div></div>
<div class="ttc" id="fuse__lowlevel_8h_html_a2172d260d34c76c25cd601870aee4220"><div class="ttname"><a href="fuse__lowlevel_8h.html#a2172d260d34c76c25cd601870aee4220">fuse_reply_poll</a></div><div class="ttdeci">int fuse_reply_poll(fuse_req_t req, unsigned revents)</div><div class="ttdef"><b>Definition:</b> <a href="fuse__lowlevel_8c_source.html#l01024">fuse_lowlevel.c:1024</a></div></div>
<div class="ttc" id="fuse_8h_html_a9024935b211288c1869dc7566895d739"><div class="ttname"><a href="fuse_8h.html#a9024935b211288c1869dc7566895d739">fuse_exit</a></div><div class="ttdeci">void fuse_exit(struct fuse *f)</div><div class="ttdef"><b>Definition:</b> <a href="fuse_8c_source.html#l04552">fuse.c:4552</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by  <a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>
|