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
|
<!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: fuse-3.9.4/lib/fuse_lowlevel.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_a13e8084a9987d27d6f484da633751e0.html">fuse-3.9.4</a></li><li class="navelem"><a class="el" href="dir_2a20d88de327540a8e7a1e76f48aac32.html">lib</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">fuse_lowlevel.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 (most of) the low-level FUSE API. The session loop</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> functions are implemented in separate files.</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> <span class="preprocessor">#define _GNU_SOURCE</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "config.h"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include "fuse_i.h"</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "fuse_kernel.h"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include "fuse_opt.h"</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include "fuse_misc.h"</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include "mount_util.h"</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include <stdio.h></span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include <stdlib.h></span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#include <stddef.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 <unistd.h></span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#include <limits.h></span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include <errno.h></span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include <assert.h></span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include <sys/file.h></span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#ifndef F_LINUX_SPECIFIC_BASE</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#define F_LINUX_SPECIFIC_BASE 1024</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#ifndef F_SETPIPE_SZ</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#define PARAM(inarg) (((char *)(inarg)) + sizeof(*(inarg)))</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="preprocessor">#define OFFSET_MAX 0x7fffffffffffffffLL</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="preprocessor">#define container_of(ptr, type, member) ({ \</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor"> const typeof( ((type *)0)->member ) *__mptr = (ptr); \</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="preprocessor"> (type *)( (char *)__mptr - offsetof(type,member) );})</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> </div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="keyword">struct </span>fuse_pollhandle {</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  uint64_t kh;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keyword">struct </span>fuse_session *se;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> };</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> </div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keyword">static</span> <span class="keywordtype">size_t</span> pagesize;</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="keyword">static</span> __attribute__((constructor)) <span class="keywordtype">void</span> fuse_ll_init_pagesize(<span class="keywordtype">void</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>  pagesize = getpagesize();</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</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="keyword">static</span> <span class="keywordtype">void</span> convert_stat(<span class="keyword">const</span> <span class="keyword">struct</span> stat *stbuf, <span class="keyword">struct</span> fuse_attr *attr)</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>  attr->ino = stbuf->st_ino;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  attr->mode = stbuf->st_mode;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  attr->nlink = stbuf->st_nlink;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  attr->uid = stbuf->st_uid;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  attr->gid = stbuf->st_gid;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  attr->rdev = stbuf->st_rdev;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  attr->size = stbuf->st_size;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  attr->blksize = stbuf->st_blksize;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  attr->blocks = stbuf->st_blocks;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  attr->atime = stbuf->st_atime;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  attr->mtime = stbuf->st_mtime;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  attr->ctime = stbuf->st_ctime;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  attr->atimensec = ST_ATIM_NSEC(stbuf);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  attr->mtimensec = ST_MTIM_NSEC(stbuf);</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  attr->ctimensec = ST_CTIM_NSEC(stbuf);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> }</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="keyword">static</span> <span class="keywordtype">void</span> convert_attr(<span class="keyword">const</span> <span class="keyword">struct</span> fuse_setattr_in *attr, <span class="keyword">struct</span> stat *stbuf)</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> {</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  stbuf->st_mode = attr->mode;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  stbuf->st_uid = attr->uid;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  stbuf->st_gid = attr->gid;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  stbuf->st_size = attr->size;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  stbuf->st_atime = attr->atime;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  stbuf->st_mtime = attr->mtime;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  stbuf->st_ctime = attr->ctime;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  ST_ATIM_NSEC_SET(stbuf, attr->atimensec);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  ST_MTIM_NSEC_SET(stbuf, attr->mtimensec);</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  ST_CTIM_NSEC_SET(stbuf, attr->ctimensec);</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <span class="keyword">static</span> <span class="keywordtype">size_t</span> iov_length(<span class="keyword">const</span> <span class="keyword">struct</span> iovec *iov, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keywordtype">size_t</span> seg;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordtype">size_t</span> ret = 0;</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="keywordflow">for</span> (seg = 0; seg < count; seg++)</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  ret += iov[seg].iov_len;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keywordflow">return</span> ret;</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> </div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="keyword">static</span> <span class="keywordtype">void</span> list_init_req(<span class="keyword">struct</span> fuse_req *req)</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>  req->next = req;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  req->prev = req;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> }</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> <span class="keyword">static</span> <span class="keywordtype">void</span> list_del_req(<span class="keyword">struct</span> fuse_req *req)</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keyword">struct </span>fuse_req *prev = req->prev;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">struct </span>fuse_req *next = req->next;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  prev->next = next;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  next->prev = prev;</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> </div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="keyword">static</span> <span class="keywordtype">void</span> list_add_req(<span class="keyword">struct</span> fuse_req *req, <span class="keyword">struct</span> fuse_req *next)</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> {</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keyword">struct </span>fuse_req *prev = next->prev;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  req->next = next;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  req->prev = prev;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  prev->next = req;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  next->prev = req;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> <span class="keyword">static</span> <span class="keywordtype">void</span> destroy_req(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> {</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  pthread_mutex_destroy(&req->lock);</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  free(req);</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> }</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="keywordtype">void</span> fuse_free_req(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</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>  <span class="keywordtype">int</span> ctr;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keyword">struct </span>fuse_session *se = req->se;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  req->u.ni.func = NULL;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  req->u.ni.data = NULL;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  list_del_req(req);</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  ctr = --req->ctr;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  fuse_chan_put(req->ch);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  req->ch = NULL;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  pthread_mutex_unlock(&se->lock);</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keywordflow">if</span> (!ctr)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  destroy_req(req);</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> }</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse_req *fuse_ll_alloc_req(<span class="keyword">struct</span> fuse_session *se)</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> {</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="keyword">struct </span>fuse_req *req;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  req = (<span class="keyword">struct </span>fuse_req *) calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_req));</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">if</span> (req == NULL) {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: failed to allocate request\n"</span>);</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  req->se = se;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  req->ctr = 1;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  list_init_req(req);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  fuse_mutex_init(&req->lock);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  }</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>  <span class="keywordflow">return</span> req;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="comment">/* Send data. If *ch* is NULL, send via session master fd */</span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_send_msg(<span class="keyword">struct</span> fuse_session *se, <span class="keyword">struct</span> fuse_chan *ch,</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keyword">struct</span> iovec *iov, <span class="keywordtype">int</span> count)</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> {</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keyword">struct </span>fuse_out_header *out = iov[0].iov_base;</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>  assert(se != NULL);</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  out->len = iov_length(iov, count);</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">if</span> (se->debug) {</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">if</span> (out->unique == 0) {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">"NOTIFY: code=%d length=%u\n"</span>,</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  out->error, out->len);</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (out->error) {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG,</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="stringliteral">" unique: %llu, error: %i (%s), outsize: %i\n"</span>,</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) out->unique, out->error,</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  strerror(-out->error), out->len);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG,</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="stringliteral">" unique: %llu, success, outsize: %i\n"</span>,</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) out->unique, out->len);</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  }</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  ssize_t res = writev(ch ? ch->fd : se->fd,</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  iov, count);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordtype">int</span> err = errno;</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>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="comment">/* ENOENT means the operation was interrupted */</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">if</span> (!<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a41b12193fa1520ff658d65679f4e513c">fuse_session_exited</a>(se) && err != ENOENT)</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  perror(<span class="stringliteral">"fuse: writing device"</span>);</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordflow">return</span> -err;</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> </div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> }</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="keywordtype">int</span> fuse_send_reply_iov_nofree(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> error, <span class="keyword">struct</span> iovec *iov,</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordtype">int</span> count)</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> {</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keyword">struct </span>fuse_out_header out;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> </div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="keywordflow">if</span> (error <= -1000 || error > 0) {</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: bad error value: %i\n"</span>, error);</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  error = -ERANGE;</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  }</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>  out.unique = req->unique;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  out.error = error;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> </div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  iov[0].iov_base = &out;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  iov[0].iov_len = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_out_header);</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> </div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordflow">return</span> fuse_send_msg(req->se, req->ch, iov, count);</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> }</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> </div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> <span class="keyword">static</span> <span class="keywordtype">int</span> send_reply_iov(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> error, <span class="keyword">struct</span> iovec *iov,</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordtype">int</span> count)</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> {</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> </div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  res = fuse_send_reply_iov_nofree(req, error, iov, count);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  fuse_free_req(req);</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> <span class="keyword">static</span> <span class="keywordtype">int</span> send_reply(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> error, <span class="keyword">const</span> <span class="keywordtype">void</span> *arg,</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keywordtype">size_t</span> argsize)</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> {</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keyword">struct </span>iovec iov[2];</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordtype">int</span> count = 1;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keywordflow">if</span> (argsize) {</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  iov[1].iov_base = (<span class="keywordtype">void</span> *) arg;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  iov[1].iov_len = argsize;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  count++;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  }</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">return</span> send_reply_iov(req, error, iov, count);</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</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> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a5fbbf591a55f09c02cd54d34bdbfe0e9">fuse_reply_iov</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keyword">struct</span> iovec *iov, <span class="keywordtype">int</span> count)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> {</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keyword">struct </span>iovec *padded_iov;</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>  padded_iov = malloc((count + 1) * <span class="keyword">sizeof</span>(<span class="keyword">struct</span> iovec));</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">if</span> (padded_iov == NULL)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">return</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOMEM);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  memcpy(padded_iov + 1, iov, count * <span class="keyword">sizeof</span>(<span class="keyword">struct</span> iovec));</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  count++;</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>  res = send_reply_iov(req, 0, padded_iov, count);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  free(padded_iov);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordflow">return</span> res;</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> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span> </div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> <span class="comment">/* `buf` is allowed to be empty so that the proper size may be</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> <span class="comment"> allocated by the caller */</span></div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> <span class="keywordtype">size_t</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad1957bcc8ece8c90f16c42c4daf3053f">fuse_add_direntry</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> bufsize,</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> <span class="keyword">struct</span> stat *stbuf, off_t off)</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>  (void)req;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordtype">size_t</span> namelen;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordtype">size_t</span> entlen;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keywordtype">size_t</span> entlen_padded;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keyword">struct </span>fuse_dirent *dirent;</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>  namelen = strlen(name);</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  entlen = FUSE_NAME_OFFSET + namelen;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  entlen_padded = FUSE_DIRENT_ALIGN(entlen);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> </div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">if</span> ((buf == NULL) || (entlen_padded > bufsize))</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordflow">return</span> entlen_padded;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  dirent = (<span class="keyword">struct </span>fuse_dirent*) buf;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  dirent->ino = stbuf->st_ino;</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  dirent->off = off;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  dirent->namelen = namelen;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  dirent->type = (stbuf->st_mode & S_IFMT) >> 12;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  memcpy(dirent->name, name, namelen);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  memset(dirent->name + namelen, 0, entlen_padded - entlen);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> </div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">return</span> entlen_padded;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> </div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> <span class="keyword">static</span> <span class="keywordtype">void</span> convert_statfs(<span class="keyword">const</span> <span class="keyword">struct</span> statvfs *stbuf,</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keyword">struct</span> fuse_kstatfs *kstatfs)</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> {</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  kstatfs->bsize = stbuf->f_bsize;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  kstatfs->frsize = stbuf->f_frsize;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  kstatfs->blocks = stbuf->f_blocks;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  kstatfs->bfree = stbuf->f_bfree;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  kstatfs->bavail = stbuf->f_bavail;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  kstatfs->files = stbuf->f_files;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  kstatfs->ffree = stbuf->f_ffree;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  kstatfs->namelen = stbuf->f_namemax;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</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> <span class="keyword">static</span> <span class="keywordtype">int</span> send_reply_ok(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keywordtype">void</span> *arg, <span class="keywordtype">size_t</span> argsize)</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> {</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">return</span> send_reply(req, 0, arg, argsize);</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> </div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> err)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">return</span> send_reply(req, -err, NULL, 0);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> }</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> </div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> {</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  fuse_free_req(req);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> }</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> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> calc_timeout_sec(<span class="keywordtype">double</span> t)</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">if</span> (t > (<span class="keywordtype">double</span>) ULONG_MAX)</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">return</span> ULONG_MAX;</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (t < 0.0)</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">return</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) t;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> calc_timeout_nsec(<span class="keywordtype">double</span> t)</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordtype">double</span> f = t - (double) calc_timeout_sec(t);</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordflow">if</span> (f < 0.0)</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (f >= 0.999999999)</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">return</span> 999999999;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">return</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) (f * 1.0e9);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> </div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fill_entry(<span class="keyword">struct</span> fuse_entry_out *arg,</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <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="l00344"></a><span class="lineno"> 344</span> {</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  arg->nodeid = e-><a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a>;</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  arg->generation = e-><a class="code" href="structfuse__entry__param.html#a4c673ec62c76f7d63d326407beb1b463">generation</a>;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  arg->entry_valid = calc_timeout_sec(e-><a class="code" href="structfuse__entry__param.html#a281b39b72e7ec574ba40d7341fd22c1d">entry_timeout</a>);</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  arg->entry_valid_nsec = calc_timeout_nsec(e-><a class="code" href="structfuse__entry__param.html#a281b39b72e7ec574ba40d7341fd22c1d">entry_timeout</a>);</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  arg->attr_valid = calc_timeout_sec(e-><a class="code" href="structfuse__entry__param.html#aa797a9f4152cae506ba479af8bbe2eb7">attr_timeout</a>);</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  arg->attr_valid_nsec = calc_timeout_nsec(e-><a class="code" href="structfuse__entry__param.html#aa797a9f4152cae506ba479af8bbe2eb7">attr_timeout</a>);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  convert_stat(&e-><a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>, &arg->attr);</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="comment">/* `buf` is allowed to be empty so that the proper size may be</span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span class="comment"> allocated by the caller */</span></div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> <span class="keywordtype">size_t</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a34f3f1beebacab5f717d95baf832a8a5">fuse_add_direntry_plus</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> bufsize,</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__entry__param.html">fuse_entry_param</a> *e, off_t off)</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>  (void)req;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordtype">size_t</span> namelen;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordtype">size_t</span> entlen;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordtype">size_t</span> entlen_padded;</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>  namelen = strlen(name);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  entlen = FUSE_NAME_OFFSET_DIRENTPLUS + namelen;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  entlen_padded = FUSE_DIRENT_ALIGN(entlen);</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">if</span> ((buf == NULL) || (entlen_padded > bufsize))</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">return</span> entlen_padded;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> </div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keyword">struct </span>fuse_direntplus *dp = (<span class="keyword">struct </span>fuse_direntplus *) buf;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  memset(&dp->entry_out, 0, <span class="keyword">sizeof</span>(dp->entry_out));</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  fill_entry(&dp->entry_out, e);</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> </div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keyword">struct </span>fuse_dirent *dirent = &dp->dirent;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  dirent->ino = e-><a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>.st_ino;</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  dirent->off = off;</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  dirent->namelen = namelen;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  dirent->type = (e-><a class="code" href="structfuse__entry__param.html#adcdee37c96ad18380a47cdbe96a323b9">attr</a>.st_mode & S_IFMT) >> 12;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  memcpy(dirent->name, name, namelen);</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  memset(dirent->name + namelen, 0, entlen_padded - entlen);</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>  <span class="keywordflow">return</span> entlen_padded;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> }</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">static</span> <span class="keywordtype">void</span> fill_open(<span class="keyword">struct</span> fuse_open_out *arg,</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *f)</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>  arg->fh = f-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a>;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="keywordflow">if</span> (f-><a class="code" href="structfuse__file__info.html#a03b59a10e62963d9affa34ad78bd144a">direct_io</a>)</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  arg->open_flags |= FOPEN_DIRECT_IO;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="keywordflow">if</span> (f-><a class="code" href="structfuse__file__info.html#a23a64eaecbf83f99aba8ee79e6de2780">keep_cache</a>)</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  arg->open_flags |= FOPEN_KEEP_CACHE;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">if</span> (f-><a class="code" href="structfuse__file__info.html#af51d1a8d47e7a9d57b4aa15c11da238d">cache_readdir</a>)</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  arg->open_flags |= FOPEN_CACHE_DIR;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">if</span> (f-><a class="code" href="structfuse__file__info.html#a272022c57a6a79dd8f98ef597786e154">nonseekable</a>)</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  arg->open_flags |= FOPEN_NONSEEKABLE;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> }</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="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a672c45e126cd240f4bcd59bf9b7e3708">fuse_reply_entry</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__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="l00401"></a><span class="lineno"> 401</span> {</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="keyword">struct </span>fuse_entry_out arg;</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordtype">size_t</span> size = req->se->conn.proto_minor < 9 ?</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  FUSE_COMPAT_ENTRY_OUT_SIZE : <span class="keyword">sizeof</span>(arg);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> </div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="comment">/* before ABI 7.4 e->ino == 0 was invalid, only ENOENT meant</span></div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> <span class="comment"> negative entry */</span></div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">if</span> (!e-><a class="code" href="structfuse__entry__param.html#a285ba89754871772d940fa4fb736bce3">ino</a> && req->se->conn.proto_minor < 4)</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordflow">return</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOENT);</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>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  fill_entry(&arg, e);</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, size);</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span> }</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> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#abea78d22349198f8370d7cb91fbf05ed">fuse_reply_create</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__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="l00417"></a><span class="lineno"> 417</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *f)</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="keywordtype">char</span> buf[<span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_entry_out) + sizeof(struct fuse_open_out)];</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordtype">size_t</span> entrysize = req->se->conn.proto_minor < 9 ?</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  FUSE_COMPAT_ENTRY_OUT_SIZE : <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_entry_out);</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keyword">struct </span>fuse_entry_out *earg = (<span class="keyword">struct </span>fuse_entry_out *) buf;</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keyword">struct </span>fuse_open_out *oarg = (<span class="keyword">struct </span>fuse_open_out *) (buf + entrysize);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> </div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  memset(buf, 0, <span class="keyword">sizeof</span>(buf));</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  fill_entry(earg, e);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  fill_open(oarg, f);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">return</span> send_reply_ok(req, buf,</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  entrysize + <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_open_out));</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> </div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad28378dc569019c32acdb4995d70be18">fuse_reply_attr</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keyword">struct</span> stat *attr,</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="keywordtype">double</span> attr_timeout)</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> {</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keyword">struct </span>fuse_attr_out arg;</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordtype">size_t</span> size = req->se->conn.proto_minor < 9 ?</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  FUSE_COMPAT_ATTR_OUT_SIZE : <span class="keyword">sizeof</span>(arg);</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span> </div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  arg.attr_valid = calc_timeout_sec(attr_timeout);</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  arg.attr_valid_nsec = calc_timeout_nsec(attr_timeout);</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  convert_stat(attr, &arg.attr);</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span> </div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, size);</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> </div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a5a5872d7f73f0bd593e00788a4c7bbb7">fuse_reply_readlink</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__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="l00448"></a><span class="lineno"> 448</span> {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keywordflow">return</span> send_reply_ok(req, linkname, strlen(linkname));</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> </div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a170f8c6b953d70928e83bcecee43bfdc">fuse_reply_open</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__file__info.html">fuse_file_info</a> *f)</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">struct </span>fuse_open_out arg;</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>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  fill_open(&arg, f);</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> }</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> </div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#aa3cfa73f61d6ef461ab5a3fbf859eb97">fuse_reply_write</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> {</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keyword">struct </span>fuse_write_out arg;</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span> </div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  arg.size = count;</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span> </div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span> }</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span> </div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a300a88b63ab7c8ca92853a97486448c0">fuse_reply_buf</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span> {</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">return</span> send_reply_ok(req, buf, size);</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span> }</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> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_send_data_iov_fallback(<span class="keyword">struct</span> fuse_session *se,</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keyword">struct</span> fuse_chan *ch,</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="keyword">struct</span> iovec *iov, <span class="keywordtype">int</span> iov_count,</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf,</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keywordtype">size_t</span> len)</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> {</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> mem_buf = FUSE_BUFVEC_INIT(len);</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordtype">void</span> *mbuf;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keywordtype">int</span> res;</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>  <span class="comment">/* Optimize common case */</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">if</span> (buf-><a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a> == 1 && 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="l00488"></a><span class="lineno"> 488</span>  !(buf-><a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>)) {</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="comment">/* FIXME: also avoid memory copy if there are multiple buffers</span></div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> <span class="comment"> but none of them contain an fd */</span></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>  iov[iov_count].iov_base = buf-><a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a>;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  iov[iov_count].iov_len = len;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  iov_count++;</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">return</span> fuse_send_msg(se, ch, iov, iov_count);</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  }</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>  res = posix_memalign(&mbuf, pagesize, len);</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keywordflow">if</span> (res != 0)</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">return</span> res;</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>  mem_buf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = mbuf;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  res = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a>(&mem_buf, buf, 0);</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keywordflow">if</span> (res < 0) {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  free(mbuf);</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keywordflow">return</span> -res;</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>  len = res;</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span> </div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  iov[iov_count].iov_base = mbuf;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  iov[iov_count].iov_len = len;</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  iov_count++;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  res = fuse_send_msg(se, ch, iov, iov_count);</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  free(mbuf);</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="keywordflow">return</span> res;</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> </div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span> <span class="keyword">struct </span>fuse_ll_pipe {</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordtype">size_t</span> size;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordtype">int</span> can_grow;</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordtype">int</span> pipe[2];</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span> };</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> </div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_ll_pipe_free(<span class="keyword">struct</span> fuse_ll_pipe *llp)</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>  close(llp->pipe[0]);</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  close(llp->pipe[1]);</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  free(llp);</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> }</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="preprocessor">#ifdef HAVE_SPLICE</span></div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span> <span class="preprocessor">#if !defined(HAVE_PIPE2) || !defined(O_CLOEXEC)</span></div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_pipe(<span class="keywordtype">int</span> fds[2])</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="keywordtype">int</span> rv = pipe(fds);</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>  <span class="keywordflow">if</span> (rv == -1)</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">return</span> rv;</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="keywordflow">if</span> (fcntl(fds[0], F_SETFL, O_NONBLOCK) == -1 ||</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  fcntl(fds[1], F_SETFL, O_NONBLOCK) == -1 ||</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  fcntl(fds[0], F_SETFD, FD_CLOEXEC) == -1 ||</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  fcntl(fds[1], F_SETFD, FD_CLOEXEC) == -1) {</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  close(fds[0]);</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  close(fds[1]);</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  rv = -1;</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>  <span class="keywordflow">return</span> rv;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> }</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_pipe(<span class="keywordtype">int</span> fds[2])</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="keywordflow">return</span> pipe2(fds, O_CLOEXEC | O_NONBLOCK);</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="preprocessor">#endif</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> </div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse_ll_pipe *fuse_ll_get_pipe(<span class="keyword">struct</span> fuse_session *se)</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>  <span class="keyword">struct </span>fuse_ll_pipe *llp = pthread_getspecific(se->pipe_key);</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">if</span> (llp == NULL) {</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  llp = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_ll_pipe));</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="keywordflow">if</span> (llp == NULL)</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> </div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  res = fuse_pipe(llp->pipe);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  free(llp);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  }</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span> </div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="comment">/*</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> <span class="comment"> *the default size is 16 pages on linux</span></div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> <span class="comment"> */</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  llp->size = pagesize * 16;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  llp->can_grow = 1;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> </div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  pthread_setspecific(se->pipe_key, llp);</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> </div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">return</span> llp;</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> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span> </div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_ll_clear_pipe(<span class="keyword">struct</span> fuse_session *se)</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>  <span class="keyword">struct </span>fuse_ll_pipe *llp = pthread_getspecific(se->pipe_key);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">if</span> (llp) {</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  pthread_setspecific(se->pipe_key, NULL);</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  fuse_ll_pipe_free(llp);</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  }</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> </div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span> <span class="preprocessor">#if defined(HAVE_SPLICE) && defined(HAVE_VMSPLICE)</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span> <span class="keyword">static</span> <span class="keywordtype">int</span> read_back(<span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len)</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordtype">int</span> res;</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>  res = read(fd, buf, len);</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: internal error: failed to read back from pipe: %s\n"</span>, strerror(errno));</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordflow">return</span> -EIO;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  }</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordflow">if</span> (res != len) {</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: internal error: short read back from pipe: %i from %zi\n"</span>, res, len);</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <span class="keywordflow">return</span> -EIO;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  }</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="keywordflow">return</span> 0;</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> </div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="keyword">static</span> <span class="keywordtype">int</span> grow_pipe_to_max(<span class="keywordtype">int</span> pipefd)</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> {</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <span class="keywordtype">int</span> max;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="keywordtype">int</span> maxfd;</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keywordtype">char</span> buf[32];</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> </div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  maxfd = open(<span class="stringliteral">"/proc/sys/fs/pipe-max-size"</span>, O_RDONLY);</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keywordflow">if</span> (maxfd < 0)</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="keywordflow">return</span> -errno;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> </div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  res = read(maxfd, buf, <span class="keyword">sizeof</span>(buf) - 1);</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordflow">if</span> (res < 0) {</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordtype">int</span> saved_errno;</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>  saved_errno = errno;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  close(maxfd);</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">return</span> -saved_errno;</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>  close(maxfd);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  buf[res] = <span class="charliteral">'\0'</span>;</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> </div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  max = atoi(buf);</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  res = fcntl(pipefd, F_SETPIPE_SZ, max);</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordflow">if</span> (res < 0)</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keywordflow">return</span> -errno;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="keywordflow">return</span> max;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> }</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> </div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_send_data_iov(<span class="keyword">struct</span> fuse_session *se, <span class="keyword">struct</span> fuse_chan *ch,</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keyword">struct</span> iovec *iov, <span class="keywordtype">int</span> iov_count,</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> {</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <span class="keywordtype">size_t</span> len = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a>(buf);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keyword">struct </span>fuse_out_header *out = iov[0].iov_base;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="keyword">struct </span>fuse_ll_pipe *llp;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keywordtype">int</span> splice_flags;</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keywordtype">size_t</span> pipesize;</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordtype">size_t</span> total_buf_size;</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="keywordtype">size_t</span> idx;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keywordtype">size_t</span> headerlen;</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> pipe_buf = FUSE_BUFVEC_INIT(len);</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span> </div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordflow">if</span> (se->broken_splice_nonblock)</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keywordflow">goto</span> fallback;</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span> </div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="keywordflow">if</span> (flags & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18adcef8052c48f314d4d9f9f05a5b4f838">FUSE_BUF_NO_SPLICE</a>)</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keywordflow">goto</span> fallback;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span> </div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  total_buf_size = 0;</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keywordflow">for</span> (idx = buf-><a class="code" href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">idx</a>; idx < buf->count; idx++) {</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  total_buf_size += buf-><a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[<a class="code" href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">idx</a>].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a>;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="keywordflow">if</span> (idx == buf-><a class="code" href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">idx</a>)</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  total_buf_size -= buf-><a class="code" href="structfuse__bufvec.html#a0fbb583168d52562f0f848562ecf63bc">off</a>;</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  }</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">if</span> (total_buf_size < 2 * pagesize)</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <span class="keywordflow">goto</span> fallback;</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keywordflow">if</span> (se->conn.proto_minor < 14 ||</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  !(se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4f8815e0f48c60c3d9cd6e72be5a84e4">FUSE_CAP_SPLICE_WRITE</a>))</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keywordflow">goto</span> fallback;</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>  llp = fuse_ll_get_pipe(se);</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordflow">if</span> (llp == NULL)</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keywordflow">goto</span> fallback;</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> </div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  headerlen = iov_length(iov, iov_count);</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span> </div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  out->len = headerlen + len;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="comment">/*</span></div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span> <span class="comment"> * Heuristic for the required pipe size, does not work if the</span></div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span> <span class="comment"> * source contains less than page size fragments</span></div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span> <span class="comment"> */</span></div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  pipesize = pagesize * (iov_count + buf-><a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a> + 1) + out->len;</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>  if (llp->size < pipesize) {</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keywordflow">if</span> (llp->can_grow) {</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  res = fcntl(llp->pipe[0], F_SETPIPE_SZ, pipesize);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  res = grow_pipe_to_max(llp->pipe[0]);</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="keywordflow">if</span> (res > 0)</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  llp->size = res;</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  llp->can_grow = 0;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordflow">goto</span> fallback;</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  }</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  llp->size = res;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">if</span> (llp->size < pipesize)</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">goto</span> fallback;</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  }</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>  res = vmsplice(llp->pipe[1], iov, iov_count, SPLICE_F_NONBLOCK);</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">if</span> (res == -1)</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="keywordflow">goto</span> fallback;</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="keywordflow">if</span> (res != headerlen) {</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  res = -EIO;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: short vmsplice to pipe: %u/%zu\n"</span>, res,</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  headerlen);</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keywordflow">goto</span> clear_pipe;</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> </div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  pipe_buf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>;</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  pipe_buf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#a62b2ae82904ac4355142984b9dd90d68">fd</a> = llp->pipe[1];</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span> </div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  res = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a>(&pipe_buf, buf,</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18a375767de945f5178e8949d284abf1f5b">FUSE_BUF_FORCE_SPLICE</a> | <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18a32ec833f1eb4b5cd9283cf9d93021037">FUSE_BUF_SPLICE_NONBLOCK</a>);</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordflow">if</span> (res < 0) {</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="keywordflow">if</span> (res == -EAGAIN || res == -EINVAL) {</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="comment">/*</span></div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span> <span class="comment"> * Should only get EAGAIN on kernels with</span></div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span> <span class="comment"> * broken SPLICE_F_NONBLOCK support (<=</span></div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span> <span class="comment"> * 2.6.35) where this error or a short read is</span></div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span> <span class="comment"> * returned even if the pipe itself is not</span></div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span> <span class="comment"> * full</span></div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span> <span class="comment"> *</span></div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span> <span class="comment"> * EINVAL might mean that splice can't handle</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span> <span class="comment"> * this combination of input and output.</span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> <span class="comment"> */</span></div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keywordflow">if</span> (res == -EAGAIN)</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  se->broken_splice_nonblock = 1;</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span> </div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  pthread_setspecific(se->pipe_key, NULL);</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  fuse_ll_pipe_free(llp);</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="keywordflow">goto</span> fallback;</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  }</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  res = -res;</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  <span class="keywordflow">goto</span> clear_pipe;</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  }</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span> </div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordflow">if</span> (res != 0 && res < len) {</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> mem_buf = FUSE_BUFVEC_INIT(len);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keywordtype">void</span> *mbuf;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordtype">size_t</span> now_len = res;</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="comment">/*</span></div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span> <span class="comment"> * For regular files a short count is either</span></div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span> <span class="comment"> * 1) due to EOF, or</span></div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span> <span class="comment"> * 2) because of broken SPLICE_F_NONBLOCK (see above)</span></div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span> <span class="comment"> *</span></div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span> <span class="comment"> * For other inputs it's possible that we overflowed</span></div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span> <span class="comment"> * the pipe because of small buffer fragments.</span></div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span> <span class="comment"> */</span></div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span> </div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  res = posix_memalign(&mbuf, pagesize, len);</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <span class="keywordflow">if</span> (res != 0)</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <span class="keywordflow">goto</span> clear_pipe;</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>  mem_buf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = mbuf;</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  mem_buf.<a class="code" href="structfuse__bufvec.html#a0fbb583168d52562f0f848562ecf63bc">off</a> = now_len;</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  res = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a>(&mem_buf, buf, 0);</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keywordflow">if</span> (res > 0) {</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keywordtype">char</span> *tmpbuf;</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordtype">size_t</span> extra_len = res;</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="comment">/*</span></div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span> <span class="comment"> * Trickiest case: got more data. Need to get</span></div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span> <span class="comment"> * back the data from the pipe and then fall</span></div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span> <span class="comment"> * back to regular write.</span></div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span> <span class="comment"> */</span></div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  tmpbuf = malloc(headerlen);</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keywordflow">if</span> (tmpbuf == NULL) {</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  free(mbuf);</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  res = ENOMEM;</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">goto</span> clear_pipe;</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  }</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  res = read_back(llp->pipe[0], tmpbuf, headerlen);</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  free(tmpbuf);</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="keywordflow">if</span> (res != 0) {</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  free(mbuf);</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="keywordflow">goto</span> clear_pipe;</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  }</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  res = read_back(llp->pipe[0], mbuf, now_len);</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="keywordflow">if</span> (res != 0) {</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  free(mbuf);</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="keywordflow">goto</span> clear_pipe;</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>  len = now_len + extra_len;</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  iov[iov_count].iov_base = mbuf;</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  iov[iov_count].iov_len = len;</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  iov_count++;</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  res = fuse_send_msg(se, ch, iov, iov_count);</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  free(mbuf);</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  }</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  free(mbuf);</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  res = now_len;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  }</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  len = res;</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  out->len = headerlen + len;</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>  <span class="keywordflow">if</span> (se->debug) {</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG,</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  <span class="stringliteral">" unique: %llu, success, outsize: %i (splice)\n"</span>,</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) out->unique, out->len);</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  }</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span> </div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  splice_flags = 0;</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">if</span> ((flags & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18af239e556066a5d73b3ff542216b157b9">FUSE_BUF_SPLICE_MOVE</a>) &&</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aef5da823dc5f202bbe033c7a5a3de9c4">FUSE_CAP_SPLICE_MOVE</a>))</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  splice_flags |= SPLICE_F_MOVE;</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span> </div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  res = splice(llp->pipe[0], NULL, ch ? ch->fd : se->fd,</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  NULL, out->len, splice_flags);</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  res = -errno;</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  perror(<span class="stringliteral">"fuse: splice from pipe"</span>);</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  <span class="keywordflow">goto</span> clear_pipe;</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  }</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="keywordflow">if</span> (res != out->len) {</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  res = -EIO;</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: short splice from pipe: %u/%u\n"</span>,</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  res, out->len);</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="keywordflow">goto</span> clear_pipe;</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  }</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordflow">return</span> 0;</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> clear_pipe:</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  fuse_ll_clear_pipe(se);</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span> </div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span> fallback:</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="keywordflow">return</span> fuse_send_data_iov_fallback(se, ch, iov, iov_count, buf, len);</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span> }</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_send_data_iov(<span class="keyword">struct</span> fuse_session *se, <span class="keyword">struct</span> fuse_chan *ch,</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="keyword">struct</span> iovec *iov, <span class="keywordtype">int</span> iov_count,</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span> {</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  <span class="keywordtype">size_t</span> len = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a>(buf);</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  (void) flags;</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span> </div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <span class="keywordflow">return</span> fuse_send_data_iov_fallback(se, ch, iov, iov_count, buf, len);</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span> }</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span> <span class="preprocessor">#endif</span></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> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a1242694fe0fb6e253a88b57795987302">fuse_reply_data</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *bufv,</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="keyword">enum</span> <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18">fuse_buf_copy_flags</a> flags)</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span> {</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="keyword">struct </span>iovec iov[2];</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keyword">struct </span>fuse_out_header out;</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keywordtype">int</span> res;</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>  iov[0].iov_base = &out;</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  iov[0].iov_len = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_out_header);</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span> </div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  out.unique = req->unique;</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  out.error = 0;</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span> </div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  res = fuse_send_data_iov(req->se, req->ch, iov, 1, bufv, flags);</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="keywordflow">if</span> (res <= 0) {</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  fuse_free_req(req);</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="keywordflow">return</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, res);</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  }</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="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#aa1d95ec3ca674253baac3639ea10f0ff">fuse_reply_statfs</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keyword">struct</span> statvfs *stbuf)</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span> {</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="keyword">struct </span>fuse_statfs_out arg;</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordtype">size_t</span> size = req->se->conn.proto_minor < 4 ?</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  FUSE_COMPAT_STATFS_SIZE : <span class="keyword">sizeof</span>(arg);</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span> </div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  convert_statfs(stbuf, &arg.st);</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span> </div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, size);</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span> }</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span> </div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#afed32e5d3e1f54d390103f79ebb8bd42">fuse_reply_xattr</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span> {</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="keyword">struct </span>fuse_getxattr_out arg;</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span> </div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  arg.size = count;</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span> </div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span> }</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span> </div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a135eda9b7d36fb4eaae2de58526d4f85">fuse_reply_lock</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keyword">const</span> <span class="keyword">struct</span> flock *lock)</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span> {</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  <span class="keyword">struct </span>fuse_lk_out arg;</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span> </div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  arg.lk.type = lock->l_type;</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="keywordflow">if</span> (lock->l_type != F_UNLCK) {</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  arg.lk.start = lock->l_start;</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="keywordflow">if</span> (lock->l_len == 0)</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  arg.lk.end = OFFSET_MAX;</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  arg.lk.end = lock->l_start + lock->l_len - 1;</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  }</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  arg.lk.pid = lock->l_pid;</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, <span class="keyword">sizeof</span>(arg));</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="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a65431e8196e0533257acad767f7b074f">fuse_reply_bmap</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, uint64_t idx)</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span> {</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keyword">struct </span>fuse_bmap_out arg;</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span> </div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  arg.block = idx;</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>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span> }</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="keyword">static</span> <span class="keyword">struct </span>fuse_ioctl_iovec *fuse_ioctl_iovec_copy(<span class="keyword">const</span> <span class="keyword">struct</span> iovec *iov,</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span> {</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="keyword">struct </span>fuse_ioctl_iovec *fiov;</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="keywordtype">size_t</span> i;</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span> </div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  fiov = malloc(<span class="keyword">sizeof</span>(fiov[0]) * count);</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordflow">if</span> (!fiov)</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span> </div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordflow">for</span> (i = 0; i < count; i++) {</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  fiov[i].base = (uintptr_t) iov[i].iov_base;</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  fiov[i].len = iov[i].iov_len;</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  }</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">return</span> fiov;</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span> }</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span> </div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a940683d07df12c24f56b4363aed90e4d">fuse_reply_ioctl_retry</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req,</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  <span class="keyword">const</span> <span class="keyword">struct</span> iovec *in_iov, <span class="keywordtype">size_t</span> in_count,</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <span class="keyword">const</span> <span class="keyword">struct</span> iovec *out_iov, <span class="keywordtype">size_t</span> out_count)</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="keyword">struct </span>fuse_ioctl_out arg;</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keyword">struct </span>fuse_ioctl_iovec *in_fiov = NULL;</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keyword">struct </span>fuse_ioctl_iovec *out_fiov = NULL;</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keyword">struct </span>iovec iov[4];</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordtype">size_t</span> count = 1;</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="keywordtype">int</span> res;</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>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  arg.flags |= FUSE_IOCTL_RETRY;</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  arg.in_iovs = in_count;</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  arg.out_iovs = out_count;</div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  iov[count].iov_base = &arg;</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  iov[count].iov_len = <span class="keyword">sizeof</span>(arg);</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  count++;</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span> </div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor < 16) {</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  <span class="keywordflow">if</span> (in_count) {</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  iov[count].iov_base = (<span class="keywordtype">void</span> *)in_iov;</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  iov[count].iov_len = <span class="keyword">sizeof</span>(in_iov[0]) * in_count;</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  count++;</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  }</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span> </div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <span class="keywordflow">if</span> (out_count) {</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  iov[count].iov_base = (<span class="keywordtype">void</span> *)out_iov;</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  iov[count].iov_len = <span class="keyword">sizeof</span>(out_iov[0]) * out_count;</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  count++;</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  }</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="comment">/* Can't handle non-compat 64bit ioctls on 32bit */</span></div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *) == 4 && req->ioctl_64bit) {</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  res = <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, EINVAL);</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  }</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="keywordflow">if</span> (in_count) {</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  in_fiov = fuse_ioctl_iovec_copy(in_iov, in_count);</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  <span class="keywordflow">if</span> (!in_fiov)</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keywordflow">goto</span> enomem;</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span> </div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  iov[count].iov_base = (<span class="keywordtype">void</span> *)in_fiov;</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  iov[count].iov_len = <span class="keyword">sizeof</span>(in_fiov[0]) * in_count;</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  count++;</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  }</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="keywordflow">if</span> (out_count) {</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  out_fiov = fuse_ioctl_iovec_copy(out_iov, out_count);</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <span class="keywordflow">if</span> (!out_fiov)</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="keywordflow">goto</span> enomem;</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span> </div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  iov[count].iov_base = (<span class="keywordtype">void</span> *)out_fiov;</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  iov[count].iov_len = <span class="keyword">sizeof</span>(out_fiov[0]) * out_count;</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  count++;</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>  }</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span> </div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  res = send_reply_iov(req, 0, iov, count);</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span> out:</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  free(in_fiov);</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  free(out_fiov);</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span> </div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span> </div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> enomem:</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  res = <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOMEM);</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span> }</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span> </div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#adf7f34f470c04f276b7091ad3b3dcb31">fuse_reply_ioctl</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> result, <span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span> {</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="keyword">struct </span>fuse_ioctl_out arg;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  <span class="keyword">struct </span>iovec iov[3];</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  <span class="keywordtype">size_t</span> count = 1;</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>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  arg.result = result;</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  iov[count].iov_base = &arg;</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  iov[count].iov_len = <span class="keyword">sizeof</span>(arg);</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  count++;</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>  <span class="keywordflow">if</span> (size) {</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  iov[count].iov_base = (<span class="keywordtype">char</span> *) buf;</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  iov[count].iov_len = size;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  count++;</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  }</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span> </div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  <span class="keywordflow">return</span> send_reply_iov(req, 0, iov, count);</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span> }</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> </div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a37381eb84c39e5fe3af9f3ef507aeeb7">fuse_reply_ioctl_iov</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> result, <span class="keyword">const</span> <span class="keyword">struct</span> iovec *iov,</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <span class="keywordtype">int</span> count)</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span> {</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  <span class="keyword">struct </span>iovec *padded_iov;</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  <span class="keyword">struct </span>fuse_ioctl_out arg;</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> </div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  padded_iov = malloc((count + 2) * <span class="keyword">sizeof</span>(<span class="keyword">struct</span> iovec));</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  <span class="keywordflow">if</span> (padded_iov == NULL)</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  <span class="keywordflow">return</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOMEM);</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> </div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  arg.result = result;</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  padded_iov[1].iov_base = &arg;</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  padded_iov[1].iov_len = <span class="keyword">sizeof</span>(arg);</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> </div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  memcpy(&padded_iov[2], iov, count * <span class="keyword">sizeof</span>(<span class="keyword">struct</span> iovec));</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> </div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  res = send_reply_iov(req, 0, padded_iov, count + 2);</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  free(padded_iov);</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> </div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span> }</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> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2172d260d34c76c25cd601870aee4220">fuse_reply_poll</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">unsigned</span> revents)</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="keyword">struct </span>fuse_poll_out arg;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span> </div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  arg.revents = revents;</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>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span> }</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span> </div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ac5dd8e5a4639d232f904e6770e7fd244">fuse_reply_lseek</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, off_t off)</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> {</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  <span class="keyword">struct </span>fuse_lseek_out arg;</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> </div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  memset(&arg, 0, <span class="keyword">sizeof</span>(arg));</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  arg.offset = off;</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> </div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="keywordflow">return</span> send_reply_ok(req, &arg, <span class="keyword">sizeof</span>(arg));</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> </div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_lookup(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  <span class="keywordtype">char</span> *name = (<span class="keywordtype">char</span> *) inarg;</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span> </div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="keywordflow">if</span> (req->se->op.lookup)</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  req->se->op.lookup(req, nodeid, name);</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> }</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> </div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_forget(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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="keyword">struct </span>fuse_forget_in *arg = (<span class="keyword">struct </span>fuse_forget_in *) inarg;</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span> </div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <span class="keywordflow">if</span> (req->se->op.forget)</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  req->se->op.forget(req, nodeid, arg->nlookup);</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(req);</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> </div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_batch_forget(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid,</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span> {</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  <span class="keyword">struct </span>fuse_batch_forget_in *arg = (<span class="keywordtype">void</span> *) inarg;</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="keyword">struct </span>fuse_forget_one *param = (<span class="keywordtype">void</span> *) PARAM(arg);</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> </div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  (void) nodeid;</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">if</span> (req->se->op.forget_multi) {</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  req->se->op.forget_multi(req, arg->count,</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  (<span class="keyword">struct</span> fuse_forget_data *) param);</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (req->se->op.forget) {</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  <span class="keywordflow">for</span> (i = 0; i < arg->count; i++) {</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  <span class="keyword">struct </span>fuse_forget_one *forget = &param[i];</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="keyword">struct </span>fuse_req *dummy_req;</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span> </div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  dummy_req = fuse_ll_alloc_req(req->se);</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  <span class="keywordflow">if</span> (dummy_req == NULL)</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span> </div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  dummy_req->unique = req->unique;</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  dummy_req->ctx = req->ctx;</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  dummy_req->ch = NULL;</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> </div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  req->se->op.forget(dummy_req, forget->nodeid,</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  forget->nlookup);</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>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(req);</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(req);</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  }</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="keyword">static</span> <span class="keywordtype">void</span> do_getattr(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> {</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fip = NULL;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</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="l01133"></a><span class="lineno"> 1133</span> </div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor >= 9) {</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  <span class="keyword">struct </span>fuse_getattr_in *arg = (<span class="keyword">struct </span>fuse_getattr_in *) inarg;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span> </div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  <span class="keywordflow">if</span> (arg->getattr_flags & FUSE_GETATTR_FH) {</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  fi.fh = arg->fh;</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  fip = &fi;</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>  }</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> </div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  <span class="keywordflow">if</span> (req->se->op.getattr)</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  req->se->op.getattr(req, nodeid, fip);</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> do_setattr(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>fuse_setattr_in *arg = (<span class="keyword">struct </span>fuse_setattr_in *) inarg;</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">if</span> (req->se->op.setattr) {</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> *fi = NULL;</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi_store;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  <span class="keyword">struct </span>stat stbuf;</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  memset(&stbuf, 0, <span class="keyword">sizeof</span>(stbuf));</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  convert_attr(arg, &stbuf);</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  <span class="keywordflow">if</span> (arg->valid & FATTR_FH) {</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  arg->valid &= ~FATTR_FH;</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  memset(&fi_store, 0, <span class="keyword">sizeof</span>(fi_store));</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  fi = &fi_store;</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  fi-><a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  }</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  arg->valid &=</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  FUSE_SET_ATTR_MODE |</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  FUSE_SET_ATTR_UID |</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  FUSE_SET_ATTR_GID |</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  FUSE_SET_ATTR_SIZE |</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  FUSE_SET_ATTR_ATIME |</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  FUSE_SET_ATTR_MTIME |</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  FUSE_SET_ATTR_ATIME_NOW |</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  FUSE_SET_ATTR_MTIME_NOW |</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  FUSE_SET_ATTR_CTIME;</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>  req->se->op.setattr(req, nodeid, &stbuf, arg->valid, fi);</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_access(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> {</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="keyword">struct </span>fuse_access_in *arg = (<span class="keyword">struct </span>fuse_access_in *) inarg;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> </div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  <span class="keywordflow">if</span> (req->se->op.access)</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  req->se->op.access(req, nodeid, arg->mask);</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span> }</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">static</span> <span class="keywordtype">void</span> do_readlink(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  (void) inarg;</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> </div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  <span class="keywordflow">if</span> (req->se->op.readlink)</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  req->se->op.readlink(req, nodeid);</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_mknod(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> {</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  <span class="keyword">struct </span>fuse_mknod_in *arg = (<span class="keyword">struct </span>fuse_mknod_in *) inarg;</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <span class="keywordtype">char</span> *name = PARAM(arg);</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>  <span class="keywordflow">if</span> (req->se->conn.proto_minor >= 12)</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  req->ctx.umask = arg->umask;</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  name = (<span class="keywordtype">char</span> *) inarg + FUSE_COMPAT_MKNOD_IN_SIZE;</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="keywordflow">if</span> (req->se->op.mknod)</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  req->se->op.mknod(req, nodeid, name, arg->mode, arg->rdev);</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_mkdir(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span> {</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <span class="keyword">struct </span>fuse_mkdir_in *arg = (<span class="keyword">struct </span>fuse_mkdir_in *) inarg;</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span> </div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor >= 12)</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  req->ctx.umask = arg->umask;</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> </div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  <span class="keywordflow">if</span> (req->se->op.mkdir)</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  req->se->op.mkdir(req, nodeid, PARAM(arg), arg->mode);</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_unlink(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span> {</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keywordtype">char</span> *name = (<span class="keywordtype">char</span> *) inarg;</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="keywordflow">if</span> (req->se->op.unlink)</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  req->se->op.unlink(req, nodeid, name);</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_rmdir(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> {</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  <span class="keywordtype">char</span> *name = (<span class="keywordtype">char</span> *) inarg;</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> </div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  <span class="keywordflow">if</span> (req->se->op.rmdir)</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  req->se->op.rmdir(req, nodeid, name);</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> }</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> <span class="keyword">static</span> <span class="keywordtype">void</span> do_symlink(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> {</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  <span class="keywordtype">char</span> *name = (<span class="keywordtype">char</span> *) inarg;</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <span class="keywordtype">char</span> *linkname = ((<span class="keywordtype">char</span> *) inarg) + strlen((<span class="keywordtype">char</span> *) inarg) + 1;</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span> </div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keywordflow">if</span> (req->se->op.symlink)</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  req->se->op.symlink(req, linkname, nodeid, name);</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_rename(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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="keyword">struct </span>fuse_rename_in *arg = (<span class="keyword">struct </span>fuse_rename_in *) inarg;</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <span class="keywordtype">char</span> *oldname = PARAM(arg);</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  <span class="keywordtype">char</span> *newname = oldname + strlen(oldname) + 1;</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> </div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  <span class="keywordflow">if</span> (req->se->op.rename)</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  req->se->op.rename(req, nodeid, oldname, arg->newdir, newname,</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  0);</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span> }</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span> </div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_rename2(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span> {</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  <span class="keyword">struct </span>fuse_rename2_in *arg = (<span class="keyword">struct </span>fuse_rename2_in *) inarg;</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  <span class="keywordtype">char</span> *oldname = PARAM(arg);</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  <span class="keywordtype">char</span> *newname = oldname + strlen(oldname) + 1;</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> </div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  <span class="keywordflow">if</span> (req->se->op.rename)</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  req->se->op.rename(req, nodeid, oldname, arg->newdir, newname,</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  arg->flags);</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> }</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> </div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_link(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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="keyword">struct </span>fuse_link_in *arg = (<span class="keyword">struct </span>fuse_link_in *) inarg;</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> </div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="keywordflow">if</span> (req->se->op.link)</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  req->se->op.link(req, arg->oldnodeid, nodeid, PARAM(arg));</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span> }</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span> </div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_create(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> {</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  <span class="keyword">struct </span>fuse_create_in *arg = (<span class="keyword">struct </span>fuse_create_in *) inarg;</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span> </div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="keywordflow">if</span> (req->se->op.create) {</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</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="l01304"></a><span class="lineno"> 1304</span>  <span class="keywordtype">char</span> *name = PARAM(arg);</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>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor >= 12)</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  req->ctx.umask = arg->umask;</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  name = (<span class="keywordtype">char</span> *) inarg + <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_open_in);</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span> </div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  req->se->op.create(req, nodeid, name, arg->mode, &fi);</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> }</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span> </div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_open(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span> {</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keyword">struct </span>fuse_open_in *arg = (<span class="keyword">struct </span>fuse_open_in *) inarg;</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</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="l01323"></a><span class="lineno"> 1323</span> </div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</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>  <span class="keywordflow">if</span> (req->se->op.open)</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  req->se->op.open(req, nodeid, &fi);</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a170f8c6b953d70928e83bcecee43bfdc">fuse_reply_open</a>(req, &fi);</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span> }</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span> </div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_read(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span> {</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="keyword">struct </span>fuse_read_in *arg = (<span class="keyword">struct </span>fuse_read_in *) inarg;</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span> </div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="keywordflow">if</span> (req->se->op.read) {</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</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="l01339"></a><span class="lineno"> 1339</span> </div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor >= 9) {</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->lock_owner;</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  }</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  req->se->op.read(req, nodeid, arg->size, arg->offset, &fi);</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_write(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> {</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="keyword">struct </span>fuse_write_in *arg = (<span class="keyword">struct </span>fuse_write_in *) inarg;</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</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="l01355"></a><span class="lineno"> 1355</span>  <span class="keywordtype">char</span> *param;</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span> </div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  fi.<a class="code" href="structfuse__file__info.html#a984187caa62aafc15abf9ff621667f3d">writepage</a> = (arg->write_flags & FUSE_WRITE_CACHE) != 0;</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> </div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor < 9) {</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  param = ((<span class="keywordtype">char</span> *) arg) + FUSE_COMPAT_WRITE_IN_SIZE;</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->lock_owner;</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  param = PARAM(arg);</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  }</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> </div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <span class="keywordflow">if</span> (req->se->op.write)</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  req->se->op.write(req, nodeid, param, arg->size,</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  arg->offset, &fi);</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span> }</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="keyword">static</span> <span class="keywordtype">void</span> do_write_buf(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg,</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__buf.html">fuse_buf</a> *ibuf)</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">struct </span>fuse_session *se = req->se;</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> bufv = {</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  .<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0] = *ibuf,</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  .count = 1,</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  };</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="keyword">struct </span>fuse_write_in *arg = (<span class="keyword">struct </span>fuse_write_in *) inarg;</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</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="l01386"></a><span class="lineno"> 1386</span> </div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  fi.<a class="code" href="structfuse__file__info.html#a984187caa62aafc15abf9ff621667f3d">writepage</a> = arg->write_flags & FUSE_WRITE_CACHE;</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> </div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  <span class="keywordflow">if</span> (se->conn.proto_minor < 9) {</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = ((<span class="keywordtype">char</span> *) arg) + FUSE_COMPAT_WRITE_IN_SIZE;</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> -= <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_in_header) +</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  FUSE_COMPAT_WRITE_IN_SIZE;</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  assert(!(bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>));</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->lock_owner;</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  <span class="keywordflow">if</span> (!(bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>))</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = PARAM(arg);</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span> </div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> -= <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_in_header) +</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  sizeof(struct fuse_write_in);</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  }</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  <span class="keywordflow">if</span> (bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> < arg->size) {</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: do_write_buf: buffer size too small\n"</span>);</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, EIO);</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  }</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = arg->size;</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span> </div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  se->op.write_buf(req, nodeid, &bufv, arg->offset, &fi);</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span> </div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> out:</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  <span class="comment">/* Need to reset the pipe if ->write_buf() didn't consume all data */</span></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="keywordflow">if</span> ((ibuf-><a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>) && bufv.<a class="code" href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">idx</a> < bufv.<a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a>)</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  fuse_ll_clear_pipe(se);</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> }</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span> </div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_flush(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span> {</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  <span class="keyword">struct </span>fuse_flush_in *arg = (<span class="keyword">struct </span>fuse_flush_in *) inarg;</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</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="l01424"></a><span class="lineno"> 1424</span> </div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  fi.<a class="code" href="structfuse__file__info.html#a9c1571cb4b6be75827f48aac5891606c">flush</a> = 1;</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor >= 7)</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->lock_owner;</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> </div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  <span class="keywordflow">if</span> (req->se->op.flush)</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  req->se->op.flush(req, nodeid, &fi);</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> <span class="keyword">static</span> <span class="keywordtype">void</span> do_release(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span> {</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <span class="keyword">struct </span>fuse_release_in *arg = (<span class="keyword">struct </span>fuse_release_in *) inarg;</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</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="l01441"></a><span class="lineno"> 1441</span> </div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordflow">if</span> (req->se->conn.proto_minor >= 8) {</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  fi.<a class="code" href="structfuse__file__info.html#a9c1571cb4b6be75827f48aac5891606c">flush</a> = (arg->release_flags & FUSE_RELEASE_FLUSH) ? 1 : 0;</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->lock_owner;</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> (arg->release_flags & FUSE_RELEASE_FLOCK_UNLOCK) {</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  fi.flock_release = 1;</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->lock_owner;</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> </div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  <span class="keywordflow">if</span> (req->se->op.release)</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  req->se->op.release(req, nodeid, &fi);</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, 0);</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span> }</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> <span class="keyword">static</span> <span class="keywordtype">void</span> do_fsync(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> {</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  <span class="keyword">struct </span>fuse_fsync_in *arg = (<span class="keyword">struct </span>fuse_fsync_in *) inarg;</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</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="l01464"></a><span class="lineno"> 1464</span>  <span class="keywordtype">int</span> datasync = arg->fsync_flags & 1;</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>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span> </div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="keywordflow">if</span> (req->se->op.fsync)</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  req->se->op.fsync(req, nodeid, datasync, &fi);</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_opendir(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span> {</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="keyword">struct </span>fuse_open_in *arg = (<span class="keyword">struct </span>fuse_open_in *) inarg;</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</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="l01479"></a><span class="lineno"> 1479</span> </div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span> </div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  <span class="keywordflow">if</span> (req->se->op.opendir)</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  req->se->op.opendir(req, nodeid, &fi);</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a170f8c6b953d70928e83bcecee43bfdc">fuse_reply_open</a>(req, &fi);</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> <span class="keyword">static</span> <span class="keywordtype">void</span> do_readdir(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span> {</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  <span class="keyword">struct </span>fuse_read_in *arg = (<span class="keyword">struct </span>fuse_read_in *) inarg;</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</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="l01493"></a><span class="lineno"> 1493</span> </div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span> </div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  <span class="keywordflow">if</span> (req->se->op.readdir)</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  req->se->op.readdir(req, nodeid, arg->size, arg->offset, &fi);</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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">void</span> do_readdirplus(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span> {</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  <span class="keyword">struct </span>fuse_read_in *arg = (<span class="keyword">struct </span>fuse_read_in *) inarg;</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</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="l01507"></a><span class="lineno"> 1507</span> </div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span> </div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keywordflow">if</span> (req->se->op.readdirplus)</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  req->se->op.readdirplus(req, nodeid, arg->size, arg->offset, &fi);</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> }</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span> </div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_releasedir(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  <span class="keyword">struct </span>fuse_release_in *arg = (<span class="keyword">struct </span>fuse_release_in *) inarg;</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</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="l01521"></a><span class="lineno"> 1521</span> </div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  fi.<a class="code" href="structfuse__file__info.html#ae7d31802727be19670193a411647bca5">flags</a> = arg->flags;</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> </div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  <span class="keywordflow">if</span> (req->se->op.releasedir)</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  req->se->op.releasedir(req, nodeid, &fi);</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, 0);</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span> }</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> </div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_fsyncdir(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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">struct </span>fuse_fsync_in *arg = (<span class="keyword">struct </span>fuse_fsync_in *) inarg;</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</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="l01536"></a><span class="lineno"> 1536</span>  <span class="keywordtype">int</span> datasync = arg->fsync_flags & 1;</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> </div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> </div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  <span class="keywordflow">if</span> (req->se->op.fsyncdir)</div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  req->se->op.fsyncdir(req, nodeid, datasync, &fi);</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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="keywordtype">void</span> do_statfs(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  (void) nodeid;</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  (void) inarg;</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="keywordflow">if</span> (req->se->op.statfs)</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  req->se->op.statfs(req, nodeid);</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  <span class="keyword">struct </span>statvfs buf = {</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>  .f_namemax = 255,</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  .f_bsize = 512,</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>  };</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#aa1d95ec3ca674253baac3639ea10f0ff">fuse_reply_statfs</a>(req, &buf);</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  }</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span> }</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> <span class="keyword">static</span> <span class="keywordtype">void</span> do_setxattr(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span> {</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  <span class="keyword">struct </span>fuse_setxattr_in *arg = (<span class="keyword">struct </span>fuse_setxattr_in *) inarg;</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  <span class="keywordtype">char</span> *name = PARAM(arg);</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  <span class="keywordtype">char</span> *value = name + strlen(name) + 1;</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> (req->se->op.setxattr)</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  req->se->op.setxattr(req, nodeid, name, value, arg->size,</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>  arg->flags);</div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span> }</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span> </div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_getxattr(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span> {</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <span class="keyword">struct </span>fuse_getxattr_in *arg = (<span class="keyword">struct </span>fuse_getxattr_in *) inarg;</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span> </div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  <span class="keywordflow">if</span> (req->se->op.getxattr)</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  req->se->op.getxattr(req, nodeid, PARAM(arg), arg->size);</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> do_listxattr(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span> {</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  <span class="keyword">struct </span>fuse_getxattr_in *arg = (<span class="keyword">struct </span>fuse_getxattr_in *) inarg;</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span> </div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <span class="keywordflow">if</span> (req->se->op.listxattr)</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  req->se->op.listxattr(req, nodeid, arg->size);</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span> }</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> <span class="keyword">static</span> <span class="keywordtype">void</span> do_removexattr(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span> {</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  <span class="keywordtype">char</span> *name = (<span class="keywordtype">char</span> *) inarg;</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span> </div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  <span class="keywordflow">if</span> (req->se->op.removexattr)</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  req->se->op.removexattr(req, nodeid, name);</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span> <span class="keyword">static</span> <span class="keywordtype">void</span> convert_fuse_file_lock(<span class="keyword">struct</span> fuse_file_lock *fl,</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <span class="keyword">struct</span> flock *flock)</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span> {</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  memset(flock, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> flock));</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  flock->l_type = fl->type;</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  flock->l_whence = SEEK_SET;</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  flock->l_start = fl->start;</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  <span class="keywordflow">if</span> (fl->end == OFFSET_MAX)</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  flock->l_len = 0;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  flock->l_len = fl->end - fl->start + 1;</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  flock->l_pid = fl->pid;</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> </div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_getlk(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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="keyword">struct </span>fuse_lk_in *arg = (<span class="keyword">struct </span>fuse_lk_in *) inarg;</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</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="l01624"></a><span class="lineno"> 1624</span>  <span class="keyword">struct </span>flock flock;</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> </div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->owner;</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span> </div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  convert_fuse_file_lock(&arg->lk, &flock);</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  <span class="keywordflow">if</span> (req->se->op.getlk)</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  req->se->op.getlk(req, nodeid, &fi, &flock);</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> }</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span> </div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_setlk_common(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid,</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg, <span class="keywordtype">int</span> sleep)</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span> {</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  <span class="keyword">struct </span>fuse_lk_in *arg = (<span class="keyword">struct </span>fuse_lk_in *) inarg;</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</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="l01642"></a><span class="lineno"> 1642</span>  <span class="keyword">struct </span>flock flock;</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>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  fi.<a class="code" href="structfuse__file__info.html#a3575f36b21f406c211c41c8c31323688">lock_owner</a> = arg->owner;</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>  <span class="keywordflow">if</span> (arg->lk_flags & FUSE_LK_FLOCK) {</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  <span class="keywordtype">int</span> op = 0;</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span> </div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  <span class="keywordflow">switch</span> (arg->lk.type) {</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  <span class="keywordflow">case</span> F_RDLCK:</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  op = LOCK_SH;</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  <span class="keywordflow">case</span> F_WRLCK:</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  op = LOCK_EX;</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  <span class="keywordflow">case</span> F_UNLCK:</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  op = LOCK_UN;</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <span class="keywordflow">break</span>;</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>  <span class="keywordflow">if</span> (!sleep)</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  op |= LOCK_NB;</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span> </div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  <span class="keywordflow">if</span> (req->se->op.flock)</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  req->se->op.flock(req, nodeid, &fi, op);</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>  convert_fuse_file_lock(&arg->lk, &flock);</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>  <span class="keywordflow">if</span> (req->se->op.setlk)</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  req->se->op.setlk(req, nodeid, &fi, &flock, sleep);</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  }</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span> }</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span> </div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_setlk(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  do_setlk_common(req, nodeid, inarg, 0);</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span> }</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span> </div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_setlkw(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  do_setlk_common(req, nodeid, inarg, 1);</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span> }</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> <span class="keyword">static</span> <span class="keywordtype">int</span> find_interrupted(<span class="keyword">struct</span> fuse_session *se, <span class="keyword">struct</span> fuse_req *req)</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span> {</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  <span class="keyword">struct </span>fuse_req *curr;</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> </div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  <span class="keywordflow">for</span> (curr = se->list.next; curr != &se->list; curr = curr->next) {</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  <span class="keywordflow">if</span> (curr->unique == req->u.i.unique) {</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a1fe719ed24a713bb5d17e4e7a0dde730">fuse_interrupt_func_t</a> func;</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  <span class="keywordtype">void</span> *data;</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>  curr->ctr++;</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  pthread_mutex_unlock(&se->lock);</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> </div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  <span class="comment">/* Ugh, ugly locking */</span></div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  pthread_mutex_lock(&curr->lock);</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  curr->interrupted = 1;</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  func = curr->u.ni.func;</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  data = curr->u.ni.data;</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>  pthread_mutex_unlock(&se->lock);</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  <span class="keywordflow">if</span> (func)</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>  func(curr, data);</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  pthread_mutex_unlock(&curr->lock);</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>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  curr->ctr--;</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  <span class="keywordflow">if</span> (!curr->ctr)</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  destroy_req(curr);</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span> </div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  }</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  }</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="keywordflow">for</span> (curr = se->interrupts.next; curr != &se->interrupts;</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  curr = curr->next) {</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  <span class="keywordflow">if</span> (curr->u.i.unique == req->u.i.unique)</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</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> <span class="keyword">static</span> <span class="keywordtype">void</span> do_interrupt(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span> {</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  <span class="keyword">struct </span>fuse_interrupt_in *arg = (<span class="keyword">struct </span>fuse_interrupt_in *) inarg;</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  <span class="keyword">struct </span>fuse_session *se = req->se;</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span> </div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>  (void) nodeid;</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>  <span class="keywordflow">if</span> (se->debug)</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">"INTERRUPT: %llu\n"</span>,</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) arg->unique);</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span> </div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  req->u.i.unique = arg->unique;</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>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  <span class="keywordflow">if</span> (find_interrupted(se, req))</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>  destroy_req(req);</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  list_add_req(req, &se->interrupts);</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  pthread_mutex_unlock(&se->lock);</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span> }</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span> </div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span> <span class="keyword">static</span> <span class="keyword">struct </span>fuse_req *check_interrupt(<span class="keyword">struct</span> fuse_session *se,</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  <span class="keyword">struct</span> fuse_req *req)</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>  <span class="keyword">struct </span>fuse_req *curr;</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> </div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  <span class="keywordflow">for</span> (curr = se->interrupts.next; curr != &se->interrupts;</div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>  curr = curr->next) {</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  <span class="keywordflow">if</span> (curr->u.i.unique == req->unique) {</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  req->interrupted = 1;</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  list_del_req(curr);</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  free(curr);</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  }</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  }</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  curr = se->interrupts.next;</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  <span class="keywordflow">if</span> (curr != &se->interrupts) {</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  list_del_req(curr);</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  list_init_req(curr);</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  <span class="keywordflow">return</span> curr;</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  } <span class="keywordflow">else</span></div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span> }</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span> </div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_bmap(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  <span class="keyword">struct </span>fuse_bmap_in *arg = (<span class="keyword">struct </span>fuse_bmap_in *) inarg;</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="keywordflow">if</span> (req->se->op.bmap)</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  req->se->op.bmap(req, nodeid, arg->blocksize, arg->block);</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_ioctl(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span> {</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  <span class="keyword">struct </span>fuse_ioctl_in *arg = (<span class="keyword">struct </span>fuse_ioctl_in *) inarg;</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags = arg->flags;</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="keywordtype">void</span> *in_buf = arg->in_size ? PARAM(arg) : NULL;</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</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="l01786"></a><span class="lineno"> 1786</span> </div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="keywordflow">if</span> (flags & FUSE_IOCTL_DIR &&</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  !(req->se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a0bfb2ecd448cb5659679df690e75581a">FUSE_CAP_IOCTL_DIR</a>)) {</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOTTY);</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  }</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span> </div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span> </div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *) == 4 && req->se->conn.proto_minor >= 16 &&</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  !(flags & FUSE_IOCTL_32BIT)) {</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  req->ioctl_64bit = 1;</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> </div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <span class="keywordflow">if</span> (req->se->op.ioctl)</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  req->se->op.ioctl(req, nodeid, arg->cmd,</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  (<span class="keywordtype">void</span> *)(uintptr_t)arg->arg, &fi, flags,</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  in_buf, arg->in_size, arg->out_size);</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span> }</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span> </div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#adf5027f8a38b2efc03858efd7fdc756a">fuse_pollhandle_destroy</a>(<span class="keyword">struct</span> fuse_pollhandle *ph)</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span> {</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  free(ph);</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span> }</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span> </div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_poll(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span> {</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  <span class="keyword">struct </span>fuse_poll_in *arg = (<span class="keyword">struct </span>fuse_poll_in *) inarg;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</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="l01818"></a><span class="lineno"> 1818</span> </div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  fi.<a class="code" href="structfuse__file__info.html#a51b0d5928ec6112456d2aa50f2c35001">poll_events</a> = arg->events;</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>  <span class="keywordflow">if</span> (req->se->op.poll) {</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  <span class="keyword">struct </span>fuse_pollhandle *ph = NULL;</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> </div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_POLL_SCHEDULE_NOTIFY) {</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  ph = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_pollhandle));</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  <span class="keywordflow">if</span> (ph == NULL) {</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOMEM);</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  <span class="keywordflow">return</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>  ph->kh = arg->kh;</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  ph->se = req->se;</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> </div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  req->se->op.poll(req, nodeid, &fi, ph);</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</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> </div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_fallocate(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</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>  <span class="keyword">struct </span>fuse_fallocate_in *arg = (<span class="keyword">struct </span>fuse_fallocate_in *) inarg;</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</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="l01846"></a><span class="lineno"> 1846</span> </div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span> </div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  <span class="keywordflow">if</span> (req->se->op.fallocate)</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  req->se->op.fallocate(req, nodeid, arg->mode, arg->offset, arg->length, &fi);</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span> }</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span> </div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_copy_file_range(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid_in, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span> {</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  <span class="keyword">struct </span>fuse_copy_file_range_in *arg = (<span class="keyword">struct </span>fuse_copy_file_range_in *) inarg;</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  <span class="keyword">struct </span><a class="code" href="structfuse__file__info.html">fuse_file_info</a> fi_in, fi_out;</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>  memset(&fi_in, 0, <span class="keyword">sizeof</span>(fi_in));</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  fi_in.fh = arg->fh_in;</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>  memset(&fi_out, 0, <span class="keyword">sizeof</span>(fi_out));</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  fi_out.fh = arg->fh_out;</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span> </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>  <span class="keywordflow">if</span> (req->se->op.copy_file_range)</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  req->se->op.copy_file_range(req, nodeid_in, arg->off_in,</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  &fi_in, arg->nodeid_out,</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>  arg->off_out, &fi_out, arg->len,</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  arg->flags);</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</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="keyword">static</span> <span class="keywordtype">void</span> do_lseek(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span> {</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  <span class="keyword">struct </span>fuse_lseek_in *arg = (<span class="keyword">struct </span>fuse_lseek_in *) inarg;</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</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="l01881"></a><span class="lineno"> 1881</span> </div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>  memset(&fi, 0, <span class="keyword">sizeof</span>(fi));</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  fi.<a class="code" href="structfuse__file__info.html#a45314d0b92a8d4c9de33d996aa59ada8">fh</a> = arg->fh;</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span> </div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  <span class="keywordflow">if</span> (req->se->op.lseek)</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  req->se->op.lseek(req, nodeid, arg->offset, arg->whence, &fi);</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, ENOSYS);</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span> }</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span> </div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_init(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span> {</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <span class="keyword">struct </span>fuse_init_in *arg = (<span class="keyword">struct </span>fuse_init_in *) inarg;</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  <span class="keyword">struct </span>fuse_init_out outarg;</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  <span class="keyword">struct </span>fuse_session *se = req->se;</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  <span class="keywordtype">size_t</span> bufsize = se->bufsize;</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <span class="keywordtype">size_t</span> outargsize = <span class="keyword">sizeof</span>(outarg);</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span> </div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  (void) nodeid;</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  <span class="keywordflow">if</span> (se->debug) {</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">"INIT: %u.%u\n"</span>, arg->major, arg->minor);</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  <span class="keywordflow">if</span> (arg->major == 7 && arg->minor >= 6) {</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">"flags=0x%08x\n"</span>, arg->flags);</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">"max_readahead=0x%08x\n"</span>,</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  arg->max_readahead);</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  }</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  }</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  se->conn.proto_major = arg->major;</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  se->conn.proto_minor = arg->minor;</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  se->conn.capable = 0;</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  se->conn.want = 0;</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span> </div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  memset(&outarg, 0, <span class="keyword">sizeof</span>(outarg));</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  outarg.major = FUSE_KERNEL_VERSION;</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  outarg.minor = FUSE_KERNEL_MINOR_VERSION;</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span> </div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  <span class="keywordflow">if</span> (arg->major < 7) {</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: unsupported protocol version: %u.%u\n"</span>,</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  arg->major, arg->minor);</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, EPROTO);</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="keywordflow">return</span>;</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> </div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  <span class="keywordflow">if</span> (arg->major > 7) {</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  <span class="comment">/* Wait for a second INIT request with a 7.X version */</span></div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  send_reply_ok(req, &outarg, <span class="keyword">sizeof</span>(outarg));</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  }</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span> </div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  <span class="keywordflow">if</span> (arg->minor >= 6) {</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  <span class="keywordflow">if</span> (arg->max_readahead < se->conn.max_readahead)</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  se->conn.max_readahead = arg->max_readahead;</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_ASYNC_READ)</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4e1bacbb44d6dca9a82255c8069c3d69">FUSE_CAP_ASYNC_READ</a>;</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_POSIX_LOCKS)</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a76f6b481e6a7c519fea9250daef6177a">FUSE_CAP_POSIX_LOCKS</a>;</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_ATOMIC_O_TRUNC)</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4c81f2838716f43fe493a61c87a62816">FUSE_CAP_ATOMIC_O_TRUNC</a>;</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_EXPORT_SUPPORT)</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a7686c11aaf80382189927b10b848d8c8">FUSE_CAP_EXPORT_SUPPORT</a>;</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_DONT_MASK)</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a0cd4cebf7ec784886836aa061a1612fe">FUSE_CAP_DONT_MASK</a>;</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_FLOCK_LOCKS)</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#afd06393448dbb60668f5a3bf0006f536">FUSE_CAP_FLOCK_LOCKS</a>;</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_AUTO_INVAL_DATA)</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a2568c799f5f90ad2f0c353d48d8b8780">FUSE_CAP_AUTO_INVAL_DATA</a>;</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_DO_READDIRPLUS)</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#ad808b93c66a58d1b4cd738af7ddcf37f">FUSE_CAP_READDIRPLUS</a>;</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_READDIRPLUS_AUTO)</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9b90333ad08d0e1c2ed0134d9305ee87">FUSE_CAP_READDIRPLUS_AUTO</a>;</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_ASYNC_DIO)</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aac172aaeb6d27e2fdcafd086f9f3c0cf">FUSE_CAP_ASYNC_DIO</a>;</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_WRITEBACK_CACHE)</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4839fce31097f4b4da7a1f01169228fa">FUSE_CAP_WRITEBACK_CACHE</a>;</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_NO_OPEN_SUPPORT)</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#ad4477fe76f57e8b726d0357a637d7aaf">FUSE_CAP_NO_OPEN_SUPPORT</a>;</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_PARALLEL_DIROPS)</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a3311a7f569e9fbf55b3f0bcaadbe4ad0">FUSE_CAP_PARALLEL_DIROPS</a>;</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_POSIX_ACL)</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5b3ef5b12be33295311d6b751846c263">FUSE_CAP_POSIX_ACL</a>;</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_HANDLE_KILLPRIV)</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a24a4a980dff3f7a4ba771a92bb59a4bd">FUSE_CAP_HANDLE_KILLPRIV</a>;</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_NO_OPENDIR_SUPPORT)</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aa573f7b730ea608463d8399659c38ca6">FUSE_CAP_NO_OPENDIR_SUPPORT</a>;</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_EXPLICIT_INVAL_DATA)</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  se->conn.capable |= <a class="code" href="fuse-3_89_80_2include_2fuse__common_8h.html#a7efed2731a9d7006dd13bcf962667f1f">FUSE_CAP_EXPLICIT_INVAL_DATA</a>;</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  <span class="keywordflow">if</span> (!(arg->flags & FUSE_MAX_PAGES)) {</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  <span class="keywordtype">size_t</span> max_bufsize =</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  FUSE_DEFAULT_MAX_PAGES_PER_REQ * getpagesize()</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>  + FUSE_BUFFER_HEADER_SIZE;</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="keywordflow">if</span> (bufsize > max_bufsize) {</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  bufsize = max_bufsize;</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  }</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>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  se->conn.max_readahead = 0;</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  }</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span> </div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  <span class="keywordflow">if</span> (se->conn.proto_minor >= 14) {</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span> <span class="preprocessor">#ifdef HAVE_SPLICE</span></div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span> <span class="preprocessor">#ifdef HAVE_VMSPLICE</span></div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4f8815e0f48c60c3d9cd6e72be5a84e4">FUSE_CAP_SPLICE_WRITE</a> | <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aef5da823dc5f202bbe033c7a5a3de9c4">FUSE_CAP_SPLICE_MOVE</a>;</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a2f8a51bc70841ab691660413836a9a14">FUSE_CAP_SPLICE_READ</a>;</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span> <span class="preprocessor">#endif</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="keywordflow">if</span> (se->conn.proto_minor >= 18)</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  se->conn.capable |= <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a0bfb2ecd448cb5659679df690e75581a">FUSE_CAP_IOCTL_DIR</a>;</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>  <span class="comment">/* Default settings for modern filesystems.</span></div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span> <span class="comment"> *</span></div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span> <span class="comment"> * Most of these capabilities were disabled by default in</span></div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span> <span class="comment"> * libfuse2 for backwards compatibility reasons. In libfuse3,</span></div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span> <span class="comment"> * we can finally enable them by default (as long as they're</span></div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span> <span class="comment"> * supported by the kernel).</span></div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span> <span class="comment"> */</span></div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span> <span class="preprocessor">#define LL_SET_DEFAULT(cond, cap) \</span></div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span> <span class="preprocessor"> if ((cond) && (se->conn.capable & (cap))) \</span></div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span> <span class="preprocessor"> se->conn.want |= (cap)</span></div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  LL_SET_DEFAULT(1, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4e1bacbb44d6dca9a82255c8069c3d69">FUSE_CAP_ASYNC_READ</a>);</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  LL_SET_DEFAULT(1, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a3311a7f569e9fbf55b3f0bcaadbe4ad0">FUSE_CAP_PARALLEL_DIROPS</a>);</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  LL_SET_DEFAULT(1, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a2568c799f5f90ad2f0c353d48d8b8780">FUSE_CAP_AUTO_INVAL_DATA</a>);</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  LL_SET_DEFAULT(1, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a24a4a980dff3f7a4ba771a92bb59a4bd">FUSE_CAP_HANDLE_KILLPRIV</a>);</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  LL_SET_DEFAULT(1, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aac172aaeb6d27e2fdcafd086f9f3c0cf">FUSE_CAP_ASYNC_DIO</a>);</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  LL_SET_DEFAULT(1, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a0bfb2ecd448cb5659679df690e75581a">FUSE_CAP_IOCTL_DIR</a>);</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  LL_SET_DEFAULT(1, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4c81f2838716f43fe493a61c87a62816">FUSE_CAP_ATOMIC_O_TRUNC</a>);</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  LL_SET_DEFAULT(se->op.write_buf, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a2f8a51bc70841ab691660413836a9a14">FUSE_CAP_SPLICE_READ</a>);</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  LL_SET_DEFAULT(se->op.getlk && se->op.setlk,</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a76f6b481e6a7c519fea9250daef6177a">FUSE_CAP_POSIX_LOCKS</a>);</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  LL_SET_DEFAULT(se->op.flock, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#afd06393448dbb60668f5a3bf0006f536">FUSE_CAP_FLOCK_LOCKS</a>);</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  LL_SET_DEFAULT(se->op.readdirplus, <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#ad808b93c66a58d1b4cd738af7ddcf37f">FUSE_CAP_READDIRPLUS</a>);</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  LL_SET_DEFAULT(se->op.readdirplus && se->op.readdir,</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9b90333ad08d0e1c2ed0134d9305ee87">FUSE_CAP_READDIRPLUS_AUTO</a>);</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  se->conn.time_gran = 1;</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>  <span class="keywordflow">if</span> (bufsize < FUSE_MIN_READ_BUFFER) {</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: warning: buffer size too small: %zu\n"</span>,</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  bufsize);</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  bufsize = FUSE_MIN_READ_BUFFER;</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  }</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  se->bufsize = bufsize;</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span> </div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  <span class="keywordflow">if</span> (se->conn.max_write > bufsize - FUSE_BUFFER_HEADER_SIZE)</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  se->conn.max_write = bufsize - FUSE_BUFFER_HEADER_SIZE;</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>  se->got_init = 1;</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  <span class="keywordflow">if</span> (se->op.init)</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  se->op.init(se->userdata, &se->conn);</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>  <span class="keywordflow">if</span> (se->conn.want & (~se->conn.capable)) {</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: error: filesystem requested capabilities "</span></div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <span class="stringliteral">"0x%x that are not supported by kernel, aborting.\n"</span>,</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  se->conn.want & (~se->conn.capable));</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, EPROTO);</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  se->error = -EPROTO;</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a198429f3fbc23ef29ef9971271827690">fuse_session_exit</a>(se);</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  }</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span> </div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  <span class="keywordtype">unsigned</span> max_read_mo = get_max_read(se->mo);</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <span class="keywordflow">if</span> (se->conn.max_read != max_read_mo) {</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: error: init() and fuse_session_new() "</span></div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  <span class="stringliteral">"requested different maximum read size (%u vs %u)\n"</span>,</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  se->conn.max_read, max_read_mo);</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, EPROTO);</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  se->error = -EPROTO;</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a198429f3fbc23ef29ef9971271827690">fuse_session_exit</a>(se);</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  <span class="keywordflow">return</span>;</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>  <span class="keywordflow">if</span> (se->conn.max_write < bufsize - FUSE_BUFFER_HEADER_SIZE) {</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  se->bufsize = se->conn.max_write + FUSE_BUFFER_HEADER_SIZE;</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  }</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keywordflow">if</span> (arg->flags & FUSE_MAX_PAGES) {</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  outarg.flags |= FUSE_MAX_PAGES;</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  outarg.max_pages = (se->conn.max_write - 1) / getpagesize() + 1;</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  }</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="comment">/* Always enable big writes, this is superseded</span></div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span> <span class="comment"> by the max_write option */</span></div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  outarg.flags |= FUSE_BIG_WRITES;</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span> </div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4e1bacbb44d6dca9a82255c8069c3d69">FUSE_CAP_ASYNC_READ</a>)</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  outarg.flags |= FUSE_ASYNC_READ;</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a76f6b481e6a7c519fea9250daef6177a">FUSE_CAP_POSIX_LOCKS</a>)</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  outarg.flags |= FUSE_POSIX_LOCKS;</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4c81f2838716f43fe493a61c87a62816">FUSE_CAP_ATOMIC_O_TRUNC</a>)</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  outarg.flags |= FUSE_ATOMIC_O_TRUNC;</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a7686c11aaf80382189927b10b848d8c8">FUSE_CAP_EXPORT_SUPPORT</a>)</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  outarg.flags |= FUSE_EXPORT_SUPPORT;</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a0cd4cebf7ec784886836aa061a1612fe">FUSE_CAP_DONT_MASK</a>)</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  outarg.flags |= FUSE_DONT_MASK;</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#afd06393448dbb60668f5a3bf0006f536">FUSE_CAP_FLOCK_LOCKS</a>)</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  outarg.flags |= FUSE_FLOCK_LOCKS;</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a2568c799f5f90ad2f0c353d48d8b8780">FUSE_CAP_AUTO_INVAL_DATA</a>)</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  outarg.flags |= FUSE_AUTO_INVAL_DATA;</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#ad808b93c66a58d1b4cd738af7ddcf37f">FUSE_CAP_READDIRPLUS</a>)</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  outarg.flags |= FUSE_DO_READDIRPLUS;</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9b90333ad08d0e1c2ed0134d9305ee87">FUSE_CAP_READDIRPLUS_AUTO</a>)</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  outarg.flags |= FUSE_READDIRPLUS_AUTO;</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aac172aaeb6d27e2fdcafd086f9f3c0cf">FUSE_CAP_ASYNC_DIO</a>)</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  outarg.flags |= FUSE_ASYNC_DIO;</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4839fce31097f4b4da7a1f01169228fa">FUSE_CAP_WRITEBACK_CACHE</a>)</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  outarg.flags |= FUSE_WRITEBACK_CACHE;</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5b3ef5b12be33295311d6b751846c263">FUSE_CAP_POSIX_ACL</a>)</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  outarg.flags |= FUSE_POSIX_ACL;</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  <span class="keywordflow">if</span> (se->conn.want & <a class="code" href="fuse-3_89_80_2include_2fuse__common_8h.html#a7efed2731a9d7006dd13bcf962667f1f">FUSE_CAP_EXPLICIT_INVAL_DATA</a>)</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  outarg.flags |= FUSE_EXPLICIT_INVAL_DATA;</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  outarg.max_readahead = se->conn.max_readahead;</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  outarg.max_write = se->conn.max_write;</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  <span class="keywordflow">if</span> (se->conn.proto_minor >= 13) {</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  <span class="keywordflow">if</span> (se->conn.max_background >= (1 << 16))</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  se->conn.max_background = (1 << 16) - 1;</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  <span class="keywordflow">if</span> (se->conn.congestion_threshold > se->conn.max_background)</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  se->conn.congestion_threshold = se->conn.max_background;</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>  <span class="keywordflow">if</span> (!se->conn.congestion_threshold) {</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  se->conn.congestion_threshold =</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  se->conn.max_background * 3 / 4;</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>  outarg.max_background = se->conn.max_background;</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  outarg.congestion_threshold = se->conn.congestion_threshold;</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  }</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  <span class="keywordflow">if</span> (se->conn.proto_minor >= 23)</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  outarg.time_gran = se->conn.time_gran;</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span> </div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <span class="keywordflow">if</span> (se->debug) {</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">" INIT: %u.%u\n"</span>, outarg.major, outarg.minor);</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">" flags=0x%08x\n"</span>, outarg.flags);</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">" max_readahead=0x%08x\n"</span>,</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  outarg.max_readahead);</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">" max_write=0x%08x\n"</span>, outarg.max_write);</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">" max_background=%i\n"</span>,</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  outarg.max_background);</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">" congestion_threshold=%i\n"</span>,</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  outarg.congestion_threshold);</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">" time_gran=%u\n"</span>,</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>  outarg.time_gran);</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  }</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  <span class="keywordflow">if</span> (arg->minor < 5)</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  outargsize = FUSE_COMPAT_INIT_OUT_SIZE;</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (arg->minor < 23)</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  outargsize = FUSE_COMPAT_22_INIT_OUT_SIZE;</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span> </div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  send_reply_ok(req, &outarg, outargsize);</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span> }</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span> </div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_destroy(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid, <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg)</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span> {</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  <span class="keyword">struct </span>fuse_session *se = req->se;</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span> </div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  (void) nodeid;</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  (void) inarg;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span> </div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  se->got_destroy = 1;</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  <span class="keywordflow">if</span> (se->op.destroy)</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  se->op.destroy(se->userdata);</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>  send_reply_ok(req, NULL, 0);</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span> }</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span> </div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span> <span class="keyword">static</span> <span class="keywordtype">void</span> list_del_nreq(<span class="keyword">struct</span> fuse_notify_req *nreq)</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span> {</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  <span class="keyword">struct </span>fuse_notify_req *prev = nreq->prev;</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  <span class="keyword">struct </span>fuse_notify_req *next = nreq->next;</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  prev->next = next;</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  next->prev = prev;</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> }</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span> </div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span> <span class="keyword">static</span> <span class="keywordtype">void</span> list_add_nreq(<span class="keyword">struct</span> fuse_notify_req *nreq,</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  <span class="keyword">struct</span> fuse_notify_req *next)</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span> {</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  <span class="keyword">struct </span>fuse_notify_req *prev = next->prev;</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  nreq->next = next;</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  nreq->prev = prev;</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>  prev->next = nreq;</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>  next->prev = nreq;</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span> }</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> <span class="keyword">static</span> <span class="keywordtype">void</span> list_init_nreq(<span class="keyword">struct</span> fuse_notify_req *nreq)</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span> {</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  nreq->next = nreq;</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  nreq->prev = nreq;</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span> }</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span> </div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span> <span class="keyword">static</span> <span class="keywordtype">void</span> do_notify_reply(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> nodeid,</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>  <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__buf.html">fuse_buf</a> *buf)</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="keyword">struct </span>fuse_session *se = req->se;</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  <span class="keyword">struct </span>fuse_notify_req *nreq;</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keyword">struct </span>fuse_notify_req *head;</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>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  head = &se->notify_list;</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  <span class="keywordflow">for</span> (nreq = head->next; nreq != head; nreq = nreq->next) {</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  <span class="keywordflow">if</span> (nreq->unique == req->unique) {</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  list_del_nreq(nreq);</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  }</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  }</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  pthread_mutex_unlock(&se->lock);</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span> </div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  <span class="keywordflow">if</span> (nreq != head)</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  nreq->reply(nreq, req, nodeid, inarg, buf);</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> <span class="keyword">static</span> <span class="keywordtype">int</span> send_notify_iov(<span class="keyword">struct</span> fuse_session *se, <span class="keywordtype">int</span> notify_code,</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  <span class="keyword">struct</span> iovec *iov, <span class="keywordtype">int</span> count)</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span> {</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>  <span class="keyword">struct </span>fuse_out_header out;</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span> </div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>  <span class="keywordflow">if</span> (!se->got_init)</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  <span class="keywordflow">return</span> -ENOTCONN;</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span> </div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  out.unique = 0;</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  out.error = notify_code;</div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  iov[0].iov_base = &out;</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  iov[0].iov_len = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_out_header);</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span> </div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  <span class="keywordflow">return</span> fuse_send_msg(se, NULL, iov, count);</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> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ab078685b1f480188031fc40aa2e2fbca">fuse_lowlevel_notify_poll</a>(<span class="keyword">struct</span> fuse_pollhandle *ph)</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span> {</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  <span class="keywordflow">if</span> (ph != NULL) {</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <span class="keyword">struct </span>fuse_notify_poll_wakeup_out outarg;</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="keyword">struct </span>iovec iov[2];</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span> </div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  outarg.kh = ph->kh;</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span> </div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  iov[1].iov_base = &outarg;</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  iov[1].iov_len = <span class="keyword">sizeof</span>(outarg);</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span> </div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  <span class="keywordflow">return</span> send_notify_iov(ph->se, FUSE_NOTIFY_POLL, iov, 2);</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="keywordflow">return</span> 0;</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> </div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a9cb974af9745294ff446d11cba2422f1">fuse_lowlevel_notify_inval_inode</a>(<span class="keyword">struct</span> fuse_session *se, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  off_t off, off_t len)</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span> {</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  <span class="keyword">struct </span>fuse_notify_inval_inode_out outarg;</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  <span class="keyword">struct </span>iovec iov[2];</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span> </div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>  <span class="keywordflow">if</span> (!se)</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  <span class="keywordflow">return</span> -EINVAL;</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span> </div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <span class="keywordflow">if</span> (se->conn.proto_minor < 12)</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  <span class="keywordflow">return</span> -ENOSYS;</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>  outarg.ino = ino;</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  outarg.off = off;</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  outarg.len = len;</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>  iov[1].iov_base = &outarg;</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  iov[1].iov_len = <span class="keyword">sizeof</span>(outarg);</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span> </div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  <span class="keywordflow">return</span> send_notify_iov(se, FUSE_NOTIFY_INVAL_INODE, iov, 2);</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span> }</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="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ab14032b74b0a57a2b3155dd6ba8d6095">fuse_lowlevel_notify_inval_entry</a>(<span class="keyword">struct</span> fuse_session *se, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent,</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">size_t</span> namelen)</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span> {</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  <span class="keyword">struct </span>fuse_notify_inval_entry_out outarg;</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  <span class="keyword">struct </span>iovec iov[3];</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="keywordflow">if</span> (!se)</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="keywordflow">return</span> -EINVAL;</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>  <span class="keywordflow">if</span> (se->conn.proto_minor < 12)</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span> </div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  outarg.parent = parent;</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  outarg.namelen = namelen;</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  outarg.padding = 0;</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span> </div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  iov[1].iov_base = &outarg;</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  iov[1].iov_len = <span class="keyword">sizeof</span>(outarg);</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  iov[2].iov_base = (<span class="keywordtype">void</span> *)name;</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  iov[2].iov_len = namelen + 1;</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="keywordflow">return</span> send_notify_iov(se, FUSE_NOTIFY_INVAL_ENTRY, iov, 3);</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span> }</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> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a399a43ff69a20ce42082a81eb1517992">fuse_lowlevel_notify_delete</a>(<span class="keyword">struct</span> fuse_session *se,</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> parent, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> child,</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">size_t</span> namelen)</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span> {</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="keyword">struct </span>fuse_notify_delete_out outarg;</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  <span class="keyword">struct </span>iovec iov[3];</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span> </div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <span class="keywordflow">if</span> (!se)</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordflow">return</span> -EINVAL;</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>  <span class="keywordflow">if</span> (se->conn.proto_minor < 18)</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span> </div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  outarg.parent = parent;</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  outarg.child = child;</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  outarg.namelen = namelen;</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  outarg.padding = 0;</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span> </div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  iov[1].iov_base = &outarg;</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  iov[1].iov_len = <span class="keyword">sizeof</span>(outarg);</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  iov[2].iov_base = (<span class="keywordtype">void</span> *)name;</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  iov[2].iov_len = namelen + 1;</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span> </div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  <span class="keywordflow">return</span> send_notify_iov(se, FUSE_NOTIFY_DELETE, iov, 3);</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span> }</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> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#af856725ed4a13ed7c17512554043edbc">fuse_lowlevel_notify_store</a>(<span class="keyword">struct</span> fuse_session *se, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>  off_t offset, <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *bufv,</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>  <span class="keyword">enum</span> <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18">fuse_buf_copy_flags</a> flags)</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>  <span class="keyword">struct </span>fuse_out_header out;</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  <span class="keyword">struct </span>fuse_notify_store_out outarg;</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  <span class="keyword">struct </span>iovec iov[3];</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  <span class="keywordtype">size_t</span> size = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a>(bufv);</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  <span class="keywordtype">int</span> res;</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span> </div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  <span class="keywordflow">if</span> (!se)</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <span class="keywordflow">return</span> -EINVAL;</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>  <span class="keywordflow">if</span> (se->conn.proto_minor < 15)</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span> </div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  out.unique = 0;</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  out.error = FUSE_NOTIFY_STORE;</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span> </div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>  outarg.nodeid = ino;</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  outarg.offset = offset;</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  outarg.size = size;</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  outarg.padding = 0;</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>  iov[0].iov_base = &out;</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  iov[0].iov_len = <span class="keyword">sizeof</span>(out);</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  iov[1].iov_base = &outarg;</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  iov[1].iov_len = <span class="keyword">sizeof</span>(outarg);</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>  res = fuse_send_data_iov(se, NULL, iov, 2, bufv, flags);</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  <span class="keywordflow">if</span> (res > 0)</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  res = -res;</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>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span> }</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span> </div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span> <span class="keyword">struct </span>fuse_retrieve_req {</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="keyword">struct </span>fuse_notify_req nreq;</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  <span class="keywordtype">void</span> *cookie;</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span> };</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span> </div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_ll_retrieve_reply(<span class="keyword">struct</span> fuse_notify_req *nreq,</div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg,</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__buf.html">fuse_buf</a> *ibuf)</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span> {</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>  <span class="keyword">struct </span>fuse_session *se = req->se;</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  <span class="keyword">struct </span>fuse_retrieve_req *rreq =</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  container_of(nreq, <span class="keyword">struct</span> fuse_retrieve_req, nreq);</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  <span class="keyword">const</span> <span class="keyword">struct </span>fuse_notify_retrieve_in *arg = inarg;</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> bufv = {</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>  .<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0] = *ibuf,</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  .count = 1,</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>  };</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span> </div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  <span class="keywordflow">if</span> (!(bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>))</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = PARAM(arg);</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span> </div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> -= <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_in_header) +</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>  sizeof(struct fuse_notify_retrieve_in);</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span> </div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  <span class="keywordflow">if</span> (bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> < arg->size) {</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: retrieve reply: buffer size too small\n"</span>);</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(req);</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  <span class="keywordflow">goto</span> out;</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  }</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  bufv.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = arg->size;</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span> </div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>  <span class="keywordflow">if</span> (se->op.retrieve_reply) {</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>  se->op.retrieve_reply(req, rreq->cookie, ino,</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>  arg->offset, &bufv);</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a85ae91390a6704dc26f8d80fed7d5678">fuse_reply_none</a>(req);</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  }</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span> out:</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>  free(rreq);</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>  <span class="keywordflow">if</span> ((ibuf-><a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>) && bufv.<a class="code" href="structfuse__bufvec.html#a41cc18cb303ee16d20b3ae1ebb0ef830">idx</a> < bufv.<a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a>)</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  fuse_ll_clear_pipe(se);</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span> }</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span> </div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a58cb3543209d2c29dc2830f2503b5058">fuse_lowlevel_notify_retrieve</a>(<span class="keyword">struct</span> fuse_session *se, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a> ino,</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  <span class="keywordtype">size_t</span> size, off_t offset, <span class="keywordtype">void</span> *cookie)</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span> {</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  <span class="keyword">struct </span>fuse_notify_retrieve_out outarg;</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  <span class="keyword">struct </span>iovec iov[2];</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  <span class="keyword">struct </span>fuse_retrieve_req *rreq;</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span> </div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  <span class="keywordflow">if</span> (!se)</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>  <span class="keywordflow">return</span> -EINVAL;</div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span> </div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  <span class="keywordflow">if</span> (se->conn.proto_minor < 15)</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>  <span class="keywordflow">return</span> -ENOSYS;</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span> </div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>  rreq = malloc(<span class="keyword">sizeof</span>(*rreq));</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  <span class="keywordflow">if</span> (rreq == NULL)</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> </div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  rreq->cookie = cookie;</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>  rreq->nreq.unique = se->notify_ctr++;</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  rreq->nreq.reply = fuse_ll_retrieve_reply;</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  list_add_nreq(&rreq->nreq, &se->notify_list);</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  pthread_mutex_unlock(&se->lock);</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>  outarg.notify_unique = rreq->nreq.unique;</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  outarg.nodeid = ino;</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  outarg.offset = offset;</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  outarg.size = size;</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  outarg.padding = 0;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span> </div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  iov[1].iov_base = &outarg;</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  iov[1].iov_len = <span class="keyword">sizeof</span>(outarg);</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span> </div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  err = send_notify_iov(se, FUSE_NOTIFY_RETRIEVE, iov, 2);</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  list_del_nreq(&rreq->nreq);</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  pthread_mutex_unlock(&se->lock);</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  free(rreq);</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  }</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">return</span> err;</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span> }</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span> </div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span> <span class="keywordtype">void</span> *<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#aab00273c65d124e44abcf2374f9c504b">fuse_req_userdata</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span> {</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>  <span class="keywordflow">return</span> req->se->userdata;</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> </div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span> <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structfuse__ctx.html">fuse_ctx</a> *<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad1d1963190eb93ae5667d32d2b387ca1">fuse_req_ctx</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span> {</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  <span class="keywordflow">return</span> &req->ctx;</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> </div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ab3cdb9744f033e37a72984489343940f">fuse_req_interrupt_func</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a1fe719ed24a713bb5d17e4e7a0dde730">fuse_interrupt_func_t</a> func,</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  <span class="keywordtype">void</span> *data)</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span> {</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  pthread_mutex_lock(&req->lock);</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  pthread_mutex_lock(&req->se->lock);</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>  req->u.ni.func = func;</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>  req->u.ni.data = data;</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  pthread_mutex_unlock(&req->se->lock);</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>  <span class="keywordflow">if</span> (req->interrupted && func)</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>  func(req, data);</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>  pthread_mutex_unlock(&req->lock);</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span> }</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">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a52674fc627647f33e63c74267f0f1f9d">fuse_req_interrupted</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req)</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span> {</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>  <span class="keywordtype">int</span> interrupted;</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>  pthread_mutex_lock(&req->se->lock);</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>  interrupted = req->interrupted;</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>  pthread_mutex_unlock(&req->se->lock);</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span> </div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  <span class="keywordflow">return</span> interrupted;</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span> }</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="keyword">static</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  void (*func)(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a>, <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ad119a72f00b4cd2e4a500fd3364ae1e2">fuse_ino_t</a>, <span class="keyword">const</span> <span class="keywordtype">void</span> *);</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *name;</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span> } fuse_ll_ops[] = {</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  [FUSE_LOOKUP] = { do_lookup, <span class="stringliteral">"LOOKUP"</span> },</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  [FUSE_FORGET] = { do_forget, <span class="stringliteral">"FORGET"</span> },</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>  [FUSE_GETATTR] = { do_getattr, <span class="stringliteral">"GETATTR"</span> },</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>  [FUSE_SETATTR] = { do_setattr, <span class="stringliteral">"SETATTR"</span> },</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>  [FUSE_READLINK] = { do_readlink, <span class="stringliteral">"READLINK"</span> },</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  [FUSE_SYMLINK] = { do_symlink, <span class="stringliteral">"SYMLINK"</span> },</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>  [FUSE_MKNOD] = { do_mknod, <span class="stringliteral">"MKNOD"</span> },</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>  [FUSE_MKDIR] = { do_mkdir, <span class="stringliteral">"MKDIR"</span> },</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>  [FUSE_UNLINK] = { do_unlink, <span class="stringliteral">"UNLINK"</span> },</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  [FUSE_RMDIR] = { do_rmdir, <span class="stringliteral">"RMDIR"</span> },</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>  [FUSE_RENAME] = { do_rename, <span class="stringliteral">"RENAME"</span> },</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  [FUSE_LINK] = { do_link, <span class="stringliteral">"LINK"</span> },</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  [FUSE_OPEN] = { do_open, <span class="stringliteral">"OPEN"</span> },</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>  [FUSE_READ] = { do_read, <span class="stringliteral">"READ"</span> },</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  [FUSE_WRITE] = { do_write, <span class="stringliteral">"WRITE"</span> },</div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  [FUSE_STATFS] = { do_statfs, <span class="stringliteral">"STATFS"</span> },</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>  [FUSE_RELEASE] = { do_release, <span class="stringliteral">"RELEASE"</span> },</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  [FUSE_FSYNC] = { do_fsync, <span class="stringliteral">"FSYNC"</span> },</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  [FUSE_SETXATTR] = { do_setxattr, <span class="stringliteral">"SETXATTR"</span> },</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>  [FUSE_GETXATTR] = { do_getxattr, <span class="stringliteral">"GETXATTR"</span> },</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  [FUSE_LISTXATTR] = { do_listxattr, <span class="stringliteral">"LISTXATTR"</span> },</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>  [FUSE_REMOVEXATTR] = { do_removexattr, <span class="stringliteral">"REMOVEXATTR"</span> },</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>  [FUSE_FLUSH] = { do_flush, <span class="stringliteral">"FLUSH"</span> },</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>  [FUSE_INIT] = { do_init, <span class="stringliteral">"INIT"</span> },</div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>  [FUSE_OPENDIR] = { do_opendir, <span class="stringliteral">"OPENDIR"</span> },</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>  [FUSE_READDIR] = { do_readdir, <span class="stringliteral">"READDIR"</span> },</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>  [FUSE_RELEASEDIR] = { do_releasedir, <span class="stringliteral">"RELEASEDIR"</span> },</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  [FUSE_FSYNCDIR] = { do_fsyncdir, <span class="stringliteral">"FSYNCDIR"</span> },</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  [FUSE_GETLK] = { do_getlk, <span class="stringliteral">"GETLK"</span> },</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  [FUSE_SETLK] = { do_setlk, <span class="stringliteral">"SETLK"</span> },</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  [FUSE_SETLKW] = { do_setlkw, <span class="stringliteral">"SETLKW"</span> },</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  [FUSE_ACCESS] = { do_access, <span class="stringliteral">"ACCESS"</span> },</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>  [FUSE_CREATE] = { do_create, <span class="stringliteral">"CREATE"</span> },</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>  [FUSE_INTERRUPT] = { do_interrupt, <span class="stringliteral">"INTERRUPT"</span> },</div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>  [FUSE_BMAP] = { do_bmap, <span class="stringliteral">"BMAP"</span> },</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>  [FUSE_IOCTL] = { do_ioctl, <span class="stringliteral">"IOCTL"</span> },</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>  [FUSE_POLL] = { do_poll, <span class="stringliteral">"POLL"</span> },</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  [FUSE_FALLOCATE] = { do_fallocate, <span class="stringliteral">"FALLOCATE"</span> },</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  [FUSE_DESTROY] = { do_destroy, <span class="stringliteral">"DESTROY"</span> },</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  [FUSE_NOTIFY_REPLY] = { (<span class="keywordtype">void</span> *) 1, <span class="stringliteral">"NOTIFY_REPLY"</span> },</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  [FUSE_BATCH_FORGET] = { do_batch_forget, <span class="stringliteral">"BATCH_FORGET"</span> },</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  [FUSE_READDIRPLUS] = { do_readdirplus, <span class="stringliteral">"READDIRPLUS"</span>},</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>  [FUSE_RENAME2] = { do_rename2, <span class="stringliteral">"RENAME2"</span> },</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  [FUSE_COPY_FILE_RANGE] = { do_copy_file_range, <span class="stringliteral">"COPY_FILE_RANGE"</span> },</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  [FUSE_LSEEK] = { do_lseek, <span class="stringliteral">"LSEEK"</span> },</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  [CUSE_INIT] = { cuse_lowlevel_init, <span class="stringliteral">"CUSE_INIT"</span> },</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span> };</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span> </div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span> <span class="preprocessor">#define FUSE_MAXOP (sizeof(fuse_ll_ops) / sizeof(fuse_ll_ops[0]))</span></div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span> </div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *opname(<span class="keyword">enum</span> fuse_opcode opcode)</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>  <span class="keywordflow">if</span> (opcode >= FUSE_MAXOP || !fuse_ll_ops[opcode].name)</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  <span class="keywordflow">return</span> <span class="stringliteral">"???"</span>;</div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  <span class="keywordflow">return</span> fuse_ll_ops[opcode].name;</div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span> }</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span> </div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span> <span class="keyword">static</span> <span class="keywordtype">int</span> fuse_ll_copy_from_pipe(<span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *dst,</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>  <span class="keyword">struct</span> <a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> *src)</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span> {</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  ssize_t res = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a>(dst, src, 0);</div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  <span class="keywordflow">if</span> (res < 0) {</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: copy from pipe: %s\n"</span>, strerror(-res));</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  }</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  <span class="keywordflow">if</span> ((<span class="keywordtype">size_t</span>)res < <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a4327f41b2fe1ca84151b407169bd86c0">fuse_buf_size</a>(dst)) {</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: copy from pipe: short read\n"</span>);</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  <span class="keywordflow">return</span> -1;</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>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span> }</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> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a411ee86ec4657ea954402a9ca263e6d0">fuse_session_process_buf</a>(<span class="keyword">struct</span> fuse_session *se,</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__buf.html">fuse_buf</a> *buf)</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>  fuse_session_process_buf_int(se, buf, NULL);</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="keywordtype">void</span> fuse_session_process_buf_int(<span class="keyword">struct</span> fuse_session *se,</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__buf.html">fuse_buf</a> *buf, <span class="keyword">struct</span> fuse_chan *ch)</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span> {</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> write_header_size = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_in_header) +</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>  sizeof(struct fuse_write_in);</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> bufv = { .<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0] = *<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>, .count = 1 };</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> tmpbuf = FUSE_BUFVEC_INIT(write_header_size);</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="keyword">struct </span>fuse_in_header *in;</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  <span class="keyword">const</span> <span class="keywordtype">void</span> *inarg;</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  <span class="keyword">struct </span>fuse_req *req;</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>  <span class="keywordtype">void</span> *mbuf = NULL;</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <span class="keywordtype">int</span> res;</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>  <span class="keywordflow">if</span> (buf-><a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>) {</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  <span class="keywordflow">if</span> (buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> < tmpbuf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a>)</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  tmpbuf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a>;</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>  mbuf = malloc(tmpbuf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a>);</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  <span class="keywordflow">if</span> (mbuf == NULL) {</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: failed to allocate header\n"</span>);</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  <span class="keywordflow">goto</span> clear_pipe;</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>  tmpbuf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = mbuf;</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>  res = fuse_ll_copy_from_pipe(&tmpbuf, &bufv);</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  <span class="keywordflow">if</span> (res < 0)</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  <span class="keywordflow">goto</span> clear_pipe;</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span> </div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  in = mbuf;</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  in = buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a>;</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  }</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span> </div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  <span class="keywordflow">if</span> (se->debug) {</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG,</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  <span class="stringliteral">"unique: %llu, opcode: %s (%i), nodeid: %llu, insize: %zu, pid: %u\n"</span>,</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) in->unique,</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>  opname((<span class="keyword">enum</span> fuse_opcode) in->opcode), in->opcode,</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>) in->nodeid, buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a>, in->pid);</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> </div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  req = fuse_ll_alloc_req(se);</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="keywordflow">if</span> (req == NULL) {</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  <span class="keyword">struct </span>fuse_out_header out = {</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  .unique = in->unique,</div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  .error = -ENOMEM,</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>  <span class="keyword">struct </span>iovec iov = {</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  .iov_base = &out,</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  .iov_len = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>fuse_out_header),</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  };</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span> </div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  fuse_send_msg(se, ch, &iov, 1);</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  <span class="keywordflow">goto</span> clear_pipe;</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>  req->unique = in->unique;</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>  req->ctx.uid = in->uid;</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>  req->ctx.gid = in->gid;</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>  req->ctx.pid = in->pid;</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  req->ch = ch ? fuse_chan_get(ch) : NULL;</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span> </div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  err = EIO;</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  <span class="keywordflow">if</span> (!se->got_init) {</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  <span class="keyword">enum</span> fuse_opcode expected;</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span> </div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  expected = se->cuse_data ? CUSE_INIT : FUSE_INIT;</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  <span class="keywordflow">if</span> (in->opcode != expected)</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  <span class="keywordflow">goto</span> reply_err;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (in->opcode == FUSE_INIT || in->opcode == CUSE_INIT)</div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  <span class="keywordflow">goto</span> reply_err;</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span> </div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  err = EACCES;</div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  <span class="comment">/* Implement -o allow_root */</span></div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  <span class="keywordflow">if</span> (se->deny_others && in->uid != se->owner && in->uid != 0 &&</div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>  in->opcode != FUSE_INIT && in->opcode != FUSE_READ &&</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  in->opcode != FUSE_WRITE && in->opcode != FUSE_FSYNC &&</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  in->opcode != FUSE_RELEASE && in->opcode != FUSE_READDIR &&</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  in->opcode != FUSE_FSYNCDIR && in->opcode != FUSE_RELEASEDIR &&</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  in->opcode != FUSE_NOTIFY_REPLY &&</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  in->opcode != FUSE_READDIRPLUS)</div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  <span class="keywordflow">goto</span> reply_err;</div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span> </div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>  err = ENOSYS;</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  <span class="keywordflow">if</span> (in->opcode >= FUSE_MAXOP || !fuse_ll_ops[in->opcode].func)</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  <span class="keywordflow">goto</span> reply_err;</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  <span class="keywordflow">if</span> (in->opcode != FUSE_INTERRUPT) {</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  <span class="keyword">struct </span>fuse_req *intr;</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  pthread_mutex_lock(&se->lock);</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  intr = check_interrupt(se, req);</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>  list_add_req(req, &se->list);</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  pthread_mutex_unlock(&se->lock);</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  <span class="keywordflow">if</span> (intr)</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(intr, EAGAIN);</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  }</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span> </div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  <span class="keywordflow">if</span> ((buf-><a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>) && write_header_size < buf->size &&</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  (in->opcode != FUSE_WRITE || !se->op.write_buf) &&</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  in->opcode != FUSE_NOTIFY_REPLY) {</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  <span class="keywordtype">void</span> *newmbuf;</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>  err = ENOMEM;</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  newmbuf = realloc(mbuf, buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a>);</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  <span class="keywordflow">if</span> (newmbuf == NULL)</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  <span class="keywordflow">goto</span> reply_err;</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>  mbuf = newmbuf;</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span> </div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  tmpbuf = FUSE_BUFVEC_INIT(buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> - write_header_size);</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  tmpbuf.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0].<a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = (<span class="keywordtype">char</span> *)mbuf + write_header_size;</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span> </div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  res = fuse_ll_copy_from_pipe(&tmpbuf, &bufv);</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  err = -res;</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  <span class="keywordflow">if</span> (res < 0)</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>  <span class="keywordflow">goto</span> reply_err;</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span> </div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  in = mbuf;</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  }</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span> </div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  inarg = (<span class="keywordtype">void</span> *) &in[1];</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  <span class="keywordflow">if</span> (in->opcode == FUSE_WRITE && se->op.write_buf)</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  do_write_buf(req, in->nodeid, inarg, buf);</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (in->opcode == FUSE_NOTIFY_REPLY)</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  do_notify_reply(req, in->nodeid, inarg, buf);</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  fuse_ll_ops[in->opcode].func(req, in->nodeid, inarg);</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> out_free:</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>  free(mbuf);</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>  <span class="keywordflow">return</span>;</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> reply_err:</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a2553c03f9a63c75e609e67f90a3a5d88">fuse_reply_err</a>(req, err);</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span> clear_pipe:</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  <span class="keywordflow">if</span> (buf-><a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>)</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  fuse_ll_clear_pipe(se);</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span> }</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span> </div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span> <span class="preprocessor">#define LL_OPTION(n,o,v) \</span></div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span> <span class="preprocessor"> { n, offsetof(struct fuse_session, o), v }</span></div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span> </div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</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_ll_opts[] = {</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  LL_OPTION(<span class="stringliteral">"debug"</span>, debug, 1),</div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  LL_OPTION(<span class="stringliteral">"-d"</span>, debug, 1),</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  LL_OPTION(<span class="stringliteral">"--debug"</span>, debug, 1),</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  LL_OPTION(<span class="stringliteral">"allow_root"</span>, deny_others, 1),</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__opt_8h.html#aca35962e17d189ceb5447f8eea11bd33">FUSE_OPT_END</a></div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span> };</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span> </div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ac6e2d0fde62dcf4f0e57afeabeefd7b1">fuse_lowlevel_version</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span> {</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  printf(<span class="stringliteral">"using FUSE kernel interface version %i.%i\n"</span>,</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  FUSE_KERNEL_VERSION, FUSE_KERNEL_MINOR_VERSION);</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  fuse_mount_version();</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span> }</div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span> </div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a990af0becaba1b5e45781d399720f85e">fuse_lowlevel_help</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span> {</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  <span class="comment">/* These are not all options, but the ones that are</span></div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span> <span class="comment"> potentially of interest to an end-user */</span></div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  printf(</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span> <span class="stringliteral">" -o allow_other allow access by all users\n"</span></div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span> <span class="stringliteral">" -o allow_root allow access by root\n"</span></div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span> <span class="stringliteral">" -o auto_unmount auto unmount on process termination\n"</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> </div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a08b5503c4e9656f9c4bc88331233cc65">fuse_session_destroy</a>(<span class="keyword">struct</span> fuse_session *se)</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span> {</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  <span class="keyword">struct </span>fuse_ll_pipe *llp;</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span> </div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  <span class="keywordflow">if</span> (se->got_init && !se->got_destroy) {</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  <span class="keywordflow">if</span> (se->op.destroy)</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  se->op.destroy(se->userdata);</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  }</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  llp = pthread_getspecific(se->pipe_key);</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  <span class="keywordflow">if</span> (llp != NULL)</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  fuse_ll_pipe_free(llp);</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  pthread_key_delete(se->pipe_key);</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  pthread_mutex_destroy(&se->lock);</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  free(se->cuse_data);</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="keywordflow">if</span> (se->fd != -1)</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  close(se->fd);</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  destroy_mount_opts(se->mo);</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  free(se);</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> </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> <span class="keyword">static</span> <span class="keywordtype">void</span> fuse_ll_pipe_destructor(<span class="keywordtype">void</span> *data)</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span> {</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  <span class="keyword">struct </span>fuse_ll_pipe *llp = data;</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  fuse_ll_pipe_free(llp);</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span> }</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span> </div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#aa434f1c9e7d71c4ed219c4dc3b1deae7">fuse_session_receive_buf</a>(<span class="keyword">struct</span> fuse_session *se, <span class="keyword">struct</span> <a class="code" href="structfuse__buf.html">fuse_buf</a> *buf)</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>  <span class="keywordflow">return</span> fuse_session_receive_buf_int(se, buf, NULL);</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span> }</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> <span class="keywordtype">int</span> fuse_session_receive_buf_int(<span class="keyword">struct</span> fuse_session *se, <span class="keyword">struct</span> <a class="code" href="structfuse__buf.html">fuse_buf</a> *buf,</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  <span class="keyword">struct</span> fuse_chan *ch)</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>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  ssize_t res;</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span> <span class="preprocessor">#ifdef HAVE_SPLICE</span></div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>  <span class="keywordtype">size_t</span> bufsize = se->bufsize;</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="keyword">struct </span>fuse_ll_pipe *llp;</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  <span class="keyword">struct </span><a class="code" href="structfuse__buf.html">fuse_buf</a> tmpbuf;</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">if</span> (se->conn.proto_minor < 14 || !(se->conn.want & <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a2f8a51bc70841ab691660413836a9a14">FUSE_CAP_SPLICE_READ</a>))</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  <span class="keywordflow">goto</span> fallback;</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>  llp = fuse_ll_get_pipe(se);</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  <span class="keywordflow">if</span> (llp == NULL)</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  <span class="keywordflow">goto</span> fallback;</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="keywordflow">if</span> (llp->size < bufsize) {</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  <span class="keywordflow">if</span> (llp->can_grow) {</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  res = fcntl(llp->pipe[0], F_SETPIPE_SZ, bufsize);</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  llp->can_grow = 0;</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  res = grow_pipe_to_max(llp->pipe[0]);</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  <span class="keywordflow">if</span> (res > 0)</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>  llp->size = res;</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  <span class="keywordflow">goto</span> fallback;</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>  llp->size = res;</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>  }</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  <span class="keywordflow">if</span> (llp->size < bufsize)</div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  <span class="keywordflow">goto</span> fallback;</div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>  }</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span> </div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>  res = splice(ch ? ch->fd : se->fd,</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>  NULL, llp->pipe[1], NULL, bufsize, 0);</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>  err = errno;</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span> </div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a41b12193fa1520ff658d65679f4e513c">fuse_session_exited</a>(se))</div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span> </div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>  <span class="keywordflow">if</span> (err == ENODEV) {</div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>  <span class="comment">/* Filesystem was unmounted, or connection was aborted</span></div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span> <span class="comment"> via /sys/fs/fuse/connections */</span></div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a198429f3fbc23ef29ef9971271827690">fuse_session_exit</a>(se);</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>  }</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  <span class="keywordflow">if</span> (err != EINTR && err != EAGAIN)</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>  perror(<span class="stringliteral">"fuse: splice from device"</span>);</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>  <span class="keywordflow">return</span> -err;</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>  }</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span> </div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>  <span class="keywordflow">if</span> (res < <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_in_header)) {</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"short splice from fuse device\n"</span>);</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>  <span class="keywordflow">return</span> -EIO;</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  }</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>  tmpbuf = (<span class="keyword">struct </span><a class="code" href="structfuse__buf.html">fuse_buf</a>) {</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  .size = res,</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  .flags = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a>,</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  .fd = llp->pipe[0],</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>  };</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span> </div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>  <span class="comment">/*</span></div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span> <span class="comment"> * Don't bother with zero copy for small requests.</span></div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span> <span class="comment"> * fuse_loop_mt() needs to check for FORGET so this more than</span></div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span> <span class="comment"> * just an optimization.</span></div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span> <span class="comment"> */</span></div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  <span class="keywordflow">if</span> (res < <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_in_header) +</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>  <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_write_in) + pagesize) {</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> src = { .<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0] = tmpbuf, .<a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a> = 1 };</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>  <span class="keyword">struct </span><a class="code" href="structfuse__bufvec.html">fuse_bufvec</a> dst = { .<a class="code" href="structfuse__bufvec.html#ac303661a9c39ade1feeb05d8238b4ed6">count</a> = 1 };</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span> </div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>  <span class="keywordflow">if</span> (!buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a>) {</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>  buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = malloc(se->bufsize);</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  <span class="keywordflow">if</span> (!buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a>) {</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR,</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  <span class="stringliteral">"fuse: failed to allocate read buffer\n"</span>);</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  }</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>  }</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>  buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = se->bufsize;</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>  buf-><a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> = 0;</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>  dst.<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>[0] = *<a class="code" href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">buf</a>;</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span> </div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>  res = <a class="code" href="fuse-3_88_80_2include_2fuse__common_8h.html#a9ca301390fb5e85b85153abb1891a3f7">fuse_buf_copy</a>(&dst, &src, 0);</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  <span class="keywordflow">if</span> (res < 0) {</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: copy from pipe: %s\n"</span>,</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  strerror(-res));</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  fuse_ll_clear_pipe(se);</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  }</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  <span class="keywordflow">if</span> (res < tmpbuf.size) {</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: copy from pipe: short read\n"</span>);</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  fuse_ll_clear_pipe(se);</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  <span class="keywordflow">return</span> -EIO;</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>  assert(res == tmpbuf.size);</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span> </div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>  <span class="comment">/* Don't overwrite buf->mem, as that would cause a leak */</span></div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>  buf-><a class="code" href="structfuse__buf.html#a62b2ae82904ac4355142984b9dd90d68">fd</a> = tmpbuf.fd;</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  buf-><a class="code" href="structfuse__buf.html#a1928e204554f2d37cb8dac28a8a2f28c">flags</a> = tmpbuf.flags;</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>  }</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>  buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = tmpbuf.size;</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>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span> </div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span> fallback:</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>  <span class="keywordflow">if</span> (!buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a>) {</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>  buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a> = malloc(se->bufsize);</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  <span class="keywordflow">if</span> (!buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a>) {</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR,</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  <span class="stringliteral">"fuse: failed to allocate read buffer\n"</span>);</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>  }</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>  }</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span> </div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span> restart:</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>  res = read(ch ? ch->fd : se->fd, buf-><a class="code" href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">mem</a>, se->bufsize);</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  err = errno;</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span> </div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>  <span class="keywordflow">if</span> (<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a41b12193fa1520ff658d65679f4e513c">fuse_session_exited</a>(se))</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>  <span class="keywordflow">if</span> (res == -1) {</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>  <span class="comment">/* ENOENT means the operation was interrupted, it's safe</span></div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span> <span class="comment"> to restart */</span></div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>  <span class="keywordflow">if</span> (err == ENOENT)</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>  <span class="keywordflow">goto</span> restart;</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span> </div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>  <span class="keywordflow">if</span> (err == ENODEV) {</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>  <span class="comment">/* Filesystem was unmounted, or connection was aborted</span></div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span> <span class="comment"> via /sys/fs/fuse/connections */</span></div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a198429f3fbc23ef29ef9971271827690">fuse_session_exit</a>(se);</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>  <span class="keywordflow">return</span> 0;</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>  <span class="comment">/* Errors occurring during normal operation: EINTR (read</span></div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span> <span class="comment"> interrupted), EAGAIN (nonblocking I/O), ENODEV (filesystem</span></div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span> <span class="comment"> umounted) */</span></div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  <span class="keywordflow">if</span> (err != EINTR && err != EAGAIN)</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  perror(<span class="stringliteral">"fuse: reading device"</span>);</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>  <span class="keywordflow">return</span> -err;</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>  }</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>  <span class="keywordflow">if</span> ((<span class="keywordtype">size_t</span>) res < <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_in_header)) {</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"short read on fuse device\n"</span>);</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>  <span class="keywordflow">return</span> -EIO;</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>  }</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span> </div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>  buf-><a class="code" href="structfuse__buf.html#afb58c1e18f434d1d4edb784d00e2e13d">size</a> = res;</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>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span> }</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_session *<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a9ee52f81d0c63d9bd46b11314ba596cf">fuse_session_new</a>(<span class="keyword">struct</span> <a class="code" href="structfuse__args.html">fuse_args</a> *args,</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structfuse__lowlevel__ops.html">fuse_lowlevel_ops</a> *op,</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>  <span class="keywordtype">size_t</span> op_size, <span class="keywordtype">void</span> *userdata)</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>  <span class="keywordtype">int</span> err;</div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>  <span class="keyword">struct </span>fuse_session *se;</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  <span class="keyword">struct </span>mount_opts *mo;</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>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structfuse__lowlevel__ops.html">fuse_lowlevel_ops</a>) < op_size) {</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: warning: library too old, some operations may not work\n"</span>);</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>  op_size = <span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structfuse__lowlevel__ops.html">fuse_lowlevel_ops</a>);</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  }</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>  <span class="keywordflow">if</span> (args-><a class="code" href="structfuse__args.html#a501883d1eababa08e05b0c802b31e11d">argc</a> == 0) {</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: empty argv passed to fuse_session_new().\n"</span>);</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>  <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>  }</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>  se = (<span class="keyword">struct </span>fuse_session *) calloc(1, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> fuse_session));</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>  <span class="keywordflow">if</span> (se == NULL) {</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: failed to allocate fuse object\n"</span>);</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>  <span class="keywordflow">goto</span> out1;</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>  se->fd = -1;</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  se->conn.max_write = UINT_MAX;</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>  se->conn.max_readahead = UINT_MAX;</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span> </div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>  <span class="comment">/* Parse options */</span></div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>  <span class="keywordflow">if</span>(<a class="code" href="fuse-3_88_80_2include_2fuse__opt_8h.html#a539ef1f571c34f516c60c4cbe2901c0e">fuse_opt_parse</a>(args, se, fuse_ll_opts, NULL) == -1)</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  <span class="keywordflow">goto</span> out2;</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  <span class="keywordflow">if</span>(se->deny_others) {</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>  <span class="comment">/* Allowing access only by root is done by instructing</span></div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span> <span class="comment"> * kernel to allow access by everyone, and then restricting</span></div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span> <span class="comment"> * access to root and mountpoint owner in libfuse.</span></div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span> <span class="comment"> */</span></div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>  <span class="comment">// We may be adding the option a second time, but</span></div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  <span class="comment">// that doesn't hurt.</span></div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>  <span class="keywordflow">if</span>(<a class="code" href="fuse-3_88_80_2include_2fuse__opt_8h.html#a21602e6a0fff64fc9c7b642d12382094">fuse_opt_add_arg</a>(args, <span class="stringliteral">"-oallow_other"</span>) == -1)</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  <span class="keywordflow">goto</span> out2;</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>  }</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>  mo = parse_mount_opts(args);</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>  <span class="keywordflow">if</span> (mo == NULL)</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>  <span class="keywordflow">goto</span> out3;</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span> </div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>  <span class="keywordflow">if</span>(args-><a class="code" href="structfuse__args.html#a501883d1eababa08e05b0c802b31e11d">argc</a> == 1 &&</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>  args-><a class="code" href="structfuse__args.html#aba205faea1c7b46b912bd509976a074a">argv</a>[0][0] == <span class="charliteral">'-'</span>) {</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: warning: argv[0] looks like an option, but "</span></div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  <span class="stringliteral">"will be ignored\n"</span>);</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (args-><a class="code" href="structfuse__args.html#a501883d1eababa08e05b0c802b31e11d">argc</a> != 1) {</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>  <span class="keywordtype">int</span> i;</div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: unknown option(s): `"</span>);</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>  <span class="keywordflow">for</span>(i = 1; i < args-><a class="code" href="structfuse__args.html#a501883d1eababa08e05b0c802b31e11d">argc</a>-1; i++)</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"%s "</span>, args-><a class="code" href="structfuse__args.html#aba205faea1c7b46b912bd509976a074a">argv</a>[i]);</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"%s'\n"</span>, args-><a class="code" href="structfuse__args.html#aba205faea1c7b46b912bd509976a074a">argv</a>[i]);</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>  <span class="keywordflow">goto</span> out4;</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>  }</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span> </div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>  <span class="keywordflow">if</span> (se->debug)</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_DEBUG, <span class="stringliteral">"FUSE library version: %s\n"</span>, PACKAGE_VERSION);</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span> </div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>  se->bufsize = FUSE_MAX_MAX_PAGES * getpagesize() +</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>  FUSE_BUFFER_HEADER_SIZE;</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>  list_init_req(&se->list);</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>  list_init_req(&se->interrupts);</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>  list_init_nreq(&se->notify_list);</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>  se->notify_ctr = 1;</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>  fuse_mutex_init(&se->lock);</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span> </div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  err = pthread_key_create(&se->pipe_key, fuse_ll_pipe_destructor);</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>  <span class="keywordflow">if</span> (err) {</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR, <span class="stringliteral">"fuse: failed to create thread specific key: %s\n"</span>,</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  strerror(err));</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>  <span class="keywordflow">goto</span> out5;</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>  memcpy(&se->op, op, op_size);</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>  se->owner = getuid();</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>  se->userdata = userdata;</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span> </div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  se->mo = mo;</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>  <span class="keywordflow">return</span> se;</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span> </div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span> out5:</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>  pthread_mutex_destroy(&se->lock);</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span> out4:</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__opt_8h.html#a2cdf272429ab3869a5162976141b287d">fuse_opt_free_args</a>(args);</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span> out3:</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>  <span class="keywordflow">if</span> (mo != NULL)</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>  destroy_mount_opts(mo);</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span> out2:</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>  free(se);</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span> out1:</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>  <span class="keywordflow">return</span> NULL;</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> </div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#aa6d77679a110582684e9ca2da623bbc2">fuse_session_mount</a>(<span class="keyword">struct</span> fuse_session *se, <span class="keyword">const</span> <span class="keywordtype">char</span> *mountpoint)</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="keywordtype">int</span> fd;</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span> </div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>  <span class="comment">/*</span></div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span> <span class="comment"> * Make sure file descriptors 0, 1 and 2 are open, otherwise chaos</span></div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span> <span class="comment"> * would ensue.</span></div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span> <span class="comment"> */</span></div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>  fd = open(<span class="stringliteral">"/dev/null"</span>, O_RDWR);</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>  <span class="keywordflow">if</span> (fd > 2)</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>  close(fd);</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>  } <span class="keywordflow">while</span> (fd >= 0 && fd <= 2);</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>  <span class="comment">/*</span></div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span> <span class="comment"> * To allow FUSE daemons to run without privileges, the caller may open</span></div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span> <span class="comment"> * /dev/fuse before launching the file system and pass on the file</span></div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span> <span class="comment"> * descriptor by specifying /dev/fd/N as the mount point. Note that the</span></div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span> <span class="comment"> * parent process takes care of performing the mount in this case.</span></div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span> <span class="comment"> */</span></div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>  fd = fuse_mnt_parse_fuse_fd(mountpoint);</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>  <span class="keywordflow">if</span> (fd != -1) {</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>  <span class="keywordflow">if</span> (fcntl(fd, F_GETFD) == -1) {</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>  <a class="code" href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a>(FUSE_LOG_ERR,</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>  <span class="stringliteral">"fuse: Invalid file descriptor /dev/fd/%u\n"</span>,</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>  fd);</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>  <span class="keywordflow">return</span> -1;</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>  se->fd = fd;</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>  }</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span> </div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  <span class="comment">/* Open channel */</span></div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>  fd = fuse_kern_mount(mountpoint, se->mo);</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>  <span class="keywordflow">if</span> (fd == -1)</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  se->fd = fd;</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span> </div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>  <span class="comment">/* Save mountpoint */</span></div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>  se->mountpoint = strdup(mountpoint);</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>  <span class="keywordflow">if</span> (se->mountpoint == NULL)</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  <span class="keywordflow">goto</span> error_out;</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span> </div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span> </div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span> error_out:</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>  fuse_kern_unmount(mountpoint, fd);</div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>  <span class="keywordflow">return</span> -1;</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> </div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a4bf19badb53d92d31d6b2fb131546a2d">fuse_session_fd</a>(<span class="keyword">struct</span> fuse_session *se)</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="keywordflow">return</span> se->fd;</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span> }</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span> </div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a6c10d942751ddb214863a8b5e53de5e8">fuse_session_unmount</a>(<span class="keyword">struct</span> fuse_session *se)</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>  <span class="keywordflow">if</span> (se->mountpoint != NULL) {</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  fuse_kern_unmount(se->mountpoint, se->fd);</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  se->fd = -1;</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>  free(se->mountpoint);</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  se->mountpoint = NULL;</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>  }</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span> }</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span> </div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span> <span class="preprocessor">#ifdef linux</span></div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a57f4dabcf044aafcdba6c4682b3a1869">fuse_req_getgroups</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> size, gid_t list[])</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>  <span class="keywordtype">char</span> *buf;</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>  <span class="keywordtype">size_t</span> bufsize = 1024;</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>  <span class="keywordtype">char</span> path[128];</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>  <span class="keywordtype">int</span> ret;</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>  <span class="keywordtype">int</span> fd;</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> pid = req->ctx.pid;</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>  <span class="keywordtype">char</span> *s;</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span> </div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>  sprintf(path, <span class="stringliteral">"/proc/%lu/task/%lu/status"</span>, pid, pid);</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span> </div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span> retry:</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>  buf = malloc(bufsize);</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>  <span class="keywordflow">if</span> (buf == NULL)</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>  <span class="keywordflow">return</span> -ENOMEM;</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span> </div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>  ret = -EIO;</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  fd = open(path, O_RDONLY);</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  <span class="keywordflow">if</span> (fd == -1)</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span> </div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>  ret = read(fd, buf, bufsize);</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>  close(fd);</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>  <span class="keywordflow">if</span> (ret < 0) {</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>  ret = -EIO;</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>  <span class="keywordflow">goto</span> out_free;</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>  }</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span> </div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>  <span class="keywordflow">if</span> ((<span class="keywordtype">size_t</span>)ret == bufsize) {</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>  free(buf);</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>  bufsize *= 4;</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>  <span class="keywordflow">goto</span> retry;</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>  }</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>  ret = -EIO;</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  s = strstr(buf, <span class="stringliteral">"\nGroups:"</span>);</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>  <span class="keywordflow">if</span> (s == NULL)</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>  <span class="keywordflow">goto</span> out_free;</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>  s += 8;</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>  ret = 0;</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>  <span class="keywordflow">while</span> (1) {</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>  <span class="keywordtype">char</span> *end;</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> val = strtoul(s, &end, 0);</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  <span class="keywordflow">if</span> (end == s)</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span> </div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>  s = end;</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>  <span class="keywordflow">if</span> (ret < size)</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>  list[ret] = val;</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>  ret++;</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>  }</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span> </div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span> out_free:</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  free(buf);</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>  <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span> }</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span> <span class="preprocessor">#else </span><span class="comment">/* linux */</span><span class="preprocessor"></span></div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span> <span class="comment">/*</span></div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span> <span class="comment"> * This is currently not implemented on other than Linux...</span></div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span> <span class="comment"> */</span></div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a57f4dabcf044aafcdba6c4682b3a1869">fuse_req_getgroups</a>(<a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a33e2aa4a8905a05397292ae047cd2257">fuse_req_t</a> req, <span class="keywordtype">int</span> size, gid_t list[])</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span> {</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  (void) req; (void) size; (void) list;</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  <span class="keywordflow">return</span> -ENOSYS;</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> <span class="preprocessor">#endif</span></div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span> </div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a198429f3fbc23ef29ef9971271827690">fuse_session_exit</a>(<span class="keyword">struct</span> fuse_session *se)</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>  se->exited = 1;</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span> }</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> <span class="keywordtype">void</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ab3d015de77ae0edeb3157321e7a5c434">fuse_session_reset</a>(<span class="keyword">struct</span> fuse_session *se)</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>  se->exited = 0;</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>  se->error = 0;</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span> }</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span> </div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span> <span class="keywordtype">int</span> <a class="code" href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a41b12193fa1520ff658d65679f4e513c">fuse_session_exited</a>(<span class="keyword">struct</span> fuse_session *se)</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span> {</div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>  <span class="keywordflow">return</span> se->exited;</div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span> }</div><div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ab3cdb9744f033e37a72984489343940f"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02426">fuse_lowlevel.c:2426</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-3_88_80_2include_2fuse__common_8h_source.html#l00721">fuse_common.h:721</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__opt_8h_html_a539ef1f571c34f516c60c4cbe2901c0e"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__opt_8c_source.html#l00398">fuse_opt.c:398</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_aa6d77679a110582684e9ca2da623bbc2"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02981">fuse_lowlevel.c:2981</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-3_88_80_2include_2fuse__common_8h_source.html#l00093">fuse_common.h:93</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ab14032b74b0a57a2b3155dd6ba8d6095"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ab14032b74b0a57a2b3155dd6ba8d6095">fuse_lowlevel_notify_inval_entry</a></div><div class="ttdeci">int fuse_lowlevel_notify_inval_entry(struct fuse_session *se, fuse_ino_t parent, const char *name, size_t namelen)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02241">fuse_lowlevel.c:2241</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a33e2aa4a8905a05397292ae047cd2257"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00049">fuse_lowlevel.h:49</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a0cd4cebf7ec784886836aa061a1612fe"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a0cd4cebf7ec784886836aa061a1612fe">FUSE_CAP_DONT_MASK</a></div><div class="ttdeci">#define FUSE_CAP_DONT_MASK</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00173">fuse_common.h:173</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a37381eb84c39e5fe3af9f3ef507aeeb7"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a37381eb84c39e5fe3af9f3ef507aeeb7">fuse_reply_ioctl_iov</a></div><div class="ttdeci">int fuse_reply_ioctl_iov(fuse_req_t req, int result, const struct iovec *iov, int count)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l01034">fuse_lowlevel.c:1034</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-3_88_80_2include_2fuse__common_8h_source.html#l00054">fuse_common.h:54</a></div></div>
<div class="ttc" id="structfuse__args_html_a501883d1eababa08e05b0c802b31e11d"><div class="ttname"><a href="structfuse__args.html#a501883d1eababa08e05b0c802b31e11d">fuse_args::argc</a></div><div class="ttdeci">int argc</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__opt_8h_source.html#l00111">fuse_opt.h:111</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-3_88_80_2include_2fuse__common_8h_source.html#l00057">fuse_common.h:57</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a41b12193fa1520ff658d65679f4e513c"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l03126">fuse_lowlevel.c:3126</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a2f8a51bc70841ab691660413836a9a14"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__common_8h_source.html#l00198">fuse_common.h:198</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a85ae91390a6704dc26f8d80fed7d5678"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00317">fuse_lowlevel.c:317</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-3_88_80_2include_2fuse__common_8h_source.html#l00100">fuse_common.h:100</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_aa434f1c9e7d71c4ed219c4dc3b1deae7"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#aa434f1c9e7d71c4ed219c4dc3b1deae7">fuse_session_receive_buf</a></div><div class="ttdeci">int fuse_session_receive_buf(struct fuse_session *se, struct fuse_buf *buf)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02727">fuse_lowlevel.c:2727</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a411ee86ec4657ea954402a9ca263e6d0"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a411ee86ec4657ea954402a9ca263e6d0">fuse_session_process_buf</a></div><div class="ttdeci">void fuse_session_process_buf(struct fuse_session *se, const struct fuse_buf *buf)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02527">fuse_lowlevel.c:2527</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ad28378dc569019c32acdb4995d70be18"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00433">fuse_lowlevel.c:433</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aac172aaeb6d27e2fdcafd086f9f3c0cf"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aac172aaeb6d27e2fdcafd086f9f3c0cf">FUSE_CAP_ASYNC_DIO</a></div><div class="ttdeci">#define FUSE_CAP_ASYNC_DIO</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00287">fuse_common.h:287</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a7686c11aaf80382189927b10b848d8c8"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__common_8h_source.html#l00165">fuse_common.h:165</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a3311a7f569e9fbf55b3f0bcaadbe4ad0"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a3311a7f569e9fbf55b3f0bcaadbe4ad0">FUSE_CAP_PARALLEL_DIROPS</a></div><div class="ttdeci">#define FUSE_CAP_PARALLEL_DIROPS</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00319">fuse_common.h:319</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a0bfb2ecd448cb5659679df690e75581a"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a0bfb2ecd448cb5659679df690e75581a">FUSE_CAP_IOCTL_DIR</a></div><div class="ttdeci">#define FUSE_CAP_IOCTL_DIR</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00218">fuse_common.h:218</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_afd06393448dbb60668f5a3bf0006f536"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__common_8h_source.html#l00211">fuse_common.h:211</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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00088">fuse_lowlevel.h:88</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a135eda9b7d36fb4eaae2de58526d4f85"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00898">fuse_lowlevel.c:898</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a9b90333ad08d0e1c2ed0134d9305ee87"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a9b90333ad08d0e1c2ed0134d9305ee87">FUSE_CAP_READDIRPLUS_AUTO</a></div><div class="ttdeci">#define FUSE_CAP_READDIRPLUS_AUTO</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00276">fuse_common.h:276</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a300a88b63ab7c8ca92853a97486448c0"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00472">fuse_lowlevel.c:472</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-3_88_80_2include_2fuse__common_8h_source.html#l00064">fuse_common.h:64</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_abea78d22349198f8370d7cb91fbf05ed"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00417">fuse_lowlevel.c:417</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_afed32e5d3e1f54d390103f79ebb8bd42"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00888">fuse_lowlevel.c:888</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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00059">fuse_lowlevel.h:59</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-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__common_8h_source.html#l00096">fuse_common.h:96</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a9cb974af9745294ff446d11cba2422f1"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02219">fuse_lowlevel.c:2219</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aa573f7b730ea608463d8399659c38ca6"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aa573f7b730ea608463d8399659c38ca6">FUSE_CAP_NO_OPENDIR_SUPPORT</a></div><div class="ttdeci">#define FUSE_CAP_NO_OPENDIR_SUPPORT</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00359">fuse_common.h:359</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ac6e2d0fde62dcf4f0e57afeabeefd7b1"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ac6e2d0fde62dcf4f0e57afeabeefd7b1">fuse_lowlevel_version</a></div><div class="ttdeci">void fuse_lowlevel_version(void)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02683">fuse_lowlevel.c:2683</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_af856725ed4a13ed7c17512554043edbc"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#af856725ed4a13ed7c17512554043edbc">fuse_lowlevel_notify_store</a></div><div class="ttdeci">int fuse_lowlevel_notify_store(struct fuse_session *se, fuse_ino_t ino, off_t offset, struct fuse_bufvec *bufv, enum fuse_buf_copy_flags flags)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02291">fuse_lowlevel.c:2291</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_aa3cfa73f61d6ef461ab5a3fbf859eb97"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00462">fuse_lowlevel.c:462</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aec0ad71a3e8c357ebe7e87cdecbdbe18a375767de945f5178e8949d284abf1f5b"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18a375767de945f5178e8949d284abf1f5b">FUSE_BUF_FORCE_SPLICE</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00639">fuse_common.h:639</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-3_88_80_2include_2fuse__common_8h_source.html#l00044">fuse_common.h:44</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ac5dd8e5a4639d232f904e6770e7fd244"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#ac5dd8e5a4639d232f904e6770e7fd244">fuse_reply_lseek</a></div><div class="ttdeci">int fuse_reply_lseek(fuse_req_t req, off_t off)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l01068">fuse_lowlevel.c:1068</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aec0ad71a3e8c357ebe7e87cdecbdbe18"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18">fuse_buf_copy_flags</a></div><div class="ttdeci">fuse_buf_copy_flags</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00621">fuse_common.h:621</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a24a4a980dff3f7a4ba771a92bb59a4bd"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a24a4a980dff3f7a4ba771a92bb59a4bd">FUSE_CAP_HANDLE_KILLPRIV</a></div><div class="ttdeci">#define FUSE_CAP_HANDLE_KILLPRIV</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00347">fuse_common.h:347</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ab078685b1f480188031fc40aa2e2fbca"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02202">fuse_lowlevel.c:2202</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a940683d07df12c24f56b4363aed90e4d"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a940683d07df12c24f56b4363aed90e4d">fuse_reply_ioctl_retry</a></div><div class="ttdeci">int fuse_reply_ioctl_retry(fuse_req_t req, const struct iovec *in_iov, size_t in_count, const struct iovec *out_iov, size_t out_count)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00943">fuse_lowlevel.c:943</a></div></div>
<div class="ttc" id="fuse-3_89_80_2include_2fuse__common_8h_html_a7efed2731a9d7006dd13bcf962667f1f"><div class="ttname"><a href="fuse-3_89_80_2include_2fuse__common_8h.html#a7efed2731a9d7006dd13bcf962667f1f">FUSE_CAP_EXPLICIT_INVAL_DATA</a></div><div class="ttdeci">#define FUSE_CAP_EXPLICIT_INVAL_DATA</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_89_80_2include_2fuse__common_8h_source.html#l00382">fuse_common.h:382</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-3_88_80_2include_2fuse__common_8h_source.html#l00046">fuse_common.h:46</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-3_88_80_2include_2fuse__common_8h_source.html#l00707">fuse_common.h:707</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a4e1bacbb44d6dca9a82255c8069c3d69"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a4e1bacbb44d6dca9a82255c8069c3d69">FUSE_CAP_ASYNC_READ</a></div><div class="ttdeci">#define FUSE_CAP_ASYNC_READ</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00141">fuse_common.h:141</a></div></div>
<div class="ttc" id="structfuse__args_html_aba205faea1c7b46b912bd509976a074a"><div class="ttname"><a href="structfuse__args.html#aba205faea1c7b46b912bd509976a074a">fuse_args::argv</a></div><div class="ttdeci">char ** argv</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__opt_8h_source.html#l00114">fuse_opt.h:114</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-3_88_80_2include_2fuse__common_8h_source.html#l00716">fuse_common.h:716</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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00111">fuse_lowlevel.h:111</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a9ee52f81d0c63d9bd46b11314ba596cf"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02886">fuse_lowlevel.c:2886</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-3_88_80_2include_2fuse__common_8h_source.html#l00711">fuse_common.h:711</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a58cb3543209d2c29dc2830f2503b5058"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a58cb3543209d2c29dc2830f2503b5058">fuse_lowlevel_notify_retrieve</a></div><div class="ttdeci">int fuse_lowlevel_notify_retrieve(struct fuse_session *se, fuse_ino_t ino, size_t size, off_t offset, void *cookie)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02371">fuse_lowlevel.c:2371</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__opt_8h_html_aca35962e17d189ceb5447f8eea11bd33"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__opt_8h_source.html#l00104">fuse_opt.h:104</a></div></div>
<div class="ttc" id="structfuse__file__info_html_a272022c57a6a79dd8f98ef597786e154"><div class="ttname"><a href="structfuse__file__info.html#a272022c57a6a79dd8f98ef597786e154">fuse_file_info::nonseekable</a></div><div class="ttdeci">unsigned int nonseekable</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00073">fuse_common.h:73</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a4bf19badb53d92d31d6b2fb131546a2d"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a4bf19badb53d92d31d6b2fb131546a2d">fuse_session_fd</a></div><div class="ttdeci">int fuse_session_fd(struct fuse_session *se)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l03031">fuse_lowlevel.c:3031</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-3_88_80_2include_2fuse__common_8h_source.html#l00675">fuse_common.h:675</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a6c10d942751ddb214863a8b5e53de5e8"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l03036">fuse_lowlevel.c:3036</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_ad4477fe76f57e8b726d0357a637d7aaf"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#ad4477fe76f57e8b726d0357a637d7aaf">FUSE_CAP_NO_OPEN_SUPPORT</a></div><div class="ttdeci">#define FUSE_CAP_NO_OPEN_SUPPORT</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00309">fuse_common.h:309</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-3_88_80_2include_2fuse__common_8h_source.html#l00069">fuse_common.h:69</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aec0ad71a3e8c357ebe7e87cdecbdbe18a32ec833f1eb4b5cd9283cf9d93021037"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18a32ec833f1eb4b5cd9283cf9d93021037">FUSE_BUF_SPLICE_NONBLOCK</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00657">fuse_common.h:657</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a9ca301390fb5e85b85153abb1891a3f7"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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="fuse-3_88_80_2lib_2buffer_8c_source.html#l00281">buffer.c:281</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a2553c03f9a63c75e609e67f90a3a5d88"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00312">fuse_lowlevel.c:312</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a4839fce31097f4b4da7a1f01169228fa"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a4839fce31097f4b4da7a1f01169228fa">FUSE_CAP_WRITEBACK_CACHE</a></div><div class="ttdeci">#define FUSE_CAP_WRITEBACK_CACHE</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00296">fuse_common.h:296</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ab3d015de77ae0edeb3157321e7a5c434"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l03120">fuse_lowlevel.c:3120</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_adf5027f8a38b2efc03858efd7fdc756a"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#adf5027f8a38b2efc03858efd7fdc756a">fuse_pollhandle_destroy</a></div><div class="ttdeci">void fuse_pollhandle_destroy(struct fuse_pollhandle *ph)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l01812">fuse_lowlevel.c:1812</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_ad808b93c66a58d1b4cd738af7ddcf37f"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#ad808b93c66a58d1b4cd738af7ddcf37f">FUSE_CAP_READDIRPLUS</a></div><div class="ttdeci">#define FUSE_CAP_READDIRPLUS</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00248">fuse_common.h:248</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a4327f41b2fe1ca84151b407169bd86c0"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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="fuse-3_88_80_2lib_2buffer_8c_source.html#l00022">buffer.c:22</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a5fbbf591a55f09c02cd54d34bdbfe0e9"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a5fbbf591a55f09c02cd54d34bdbfe0e9">fuse_reply_iov</a></div><div class="ttdeci">int fuse_reply_iov(fuse_req_t req, const struct iovec *iov, int count)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00246">fuse_lowlevel.c:246</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aef5da823dc5f202bbe033c7a5a3de9c4"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aef5da823dc5f202bbe033c7a5a3de9c4">FUSE_CAP_SPLICE_MOVE</a></div><div class="ttdeci">#define FUSE_CAP_SPLICE_MOVE</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00189">fuse_common.h:189</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a76f6b481e6a7c519fea9250daef6177a"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__common_8h_source.html#l00149">fuse_common.h:149</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a4c81f2838716f43fe493a61c87a62816"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a4c81f2838716f43fe493a61c87a62816">FUSE_CAP_ATOMIC_O_TRUNC</a></div><div class="ttdeci">#define FUSE_CAP_ATOMIC_O_TRUNC</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00158">fuse_common.h:158</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ad1957bcc8ece8c90f16c42c4daf3053f"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00267">fuse_lowlevel.c:267</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_aab00273c65d124e44abcf2374f9c504b"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02416">fuse_lowlevel.c:2416</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__opt_8h_html_a2cdf272429ab3869a5162976141b287d"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__opt_8h.html#a2cdf272429ab3869a5162976141b287d">fuse_opt_free_args</a></div><div class="ttdeci">void fuse_opt_free_args(struct fuse_args *args)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__opt_8c_source.html#l00034">fuse_opt.c:34</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a57f4dabcf044aafcdba6c4682b3a1869"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l03108">fuse_lowlevel.c:3108</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a672c45e126cd240f4bcd59bf9b7e3708"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00401">fuse_lowlevel.c:401</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aec0ad71a3e8c357ebe7e87cdecbdbe18af239e556066a5d73b3ff542216b157b9"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18af239e556066a5d73b3ff542216b157b9">FUSE_BUF_SPLICE_MOVE</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00648">fuse_common.h:648</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_aa1d95ec3ca674253baac3639ea10f0ff"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00876">fuse_lowlevel.c:876</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ad1d1963190eb93ae5667d32d2b387ca1"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02421">fuse_lowlevel.c:2421</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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00079">fuse_lowlevel.h:79</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a08b5503c4e9656f9c4bc88331233cc65"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02700">fuse_lowlevel.c:2700</a></div></div>
<div class="ttc" id="structfuse__file__info_html_af51d1a8d47e7a9d57b4aa15c11da238d"><div class="ttname"><a href="structfuse__file__info.html#af51d1a8d47e7a9d57b4aa15c11da238d">fuse_file_info::cache_readdir</a></div><div class="ttdeci">unsigned int cache_readdir</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00084">fuse_common.h:84</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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00172">fuse_lowlevel.h:172</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a4f8815e0f48c60c3d9cd6e72be5a84e4"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a4f8815e0f48c60c3d9cd6e72be5a84e4">FUSE_CAP_SPLICE_WRITE</a></div><div class="ttdeci">#define FUSE_CAP_SPLICE_WRITE</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00181">fuse_common.h:181</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-3_88_80_2include_2fuse__opt_8h_source.html#l00077">fuse_opt.h:77</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_adf7f34f470c04f276b7091ad3b3dcb31"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l01013">fuse_lowlevel.c:1013</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a1242694fe0fb6e253a88b57795987302"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00854">fuse_lowlevel.c:854</a></div></div>
<div class="ttc" id="structfuse__buf_html_ac431db720526e68fd6c83eb0951ea1de"><div class="ttname"><a href="structfuse__buf.html#ac431db720526e68fd6c83eb0951ea1de">fuse_buf::mem</a></div><div class="ttdeci">void * mem</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00682">fuse_common.h:682</a></div></div>
<div class="ttc" id="structfuse__bufvec_html_a4182555be43b16c0778d0dd9eb2bf7c4"><div class="ttname"><a href="structfuse__bufvec.html#a4182555be43b16c0778d0dd9eb2bf7c4">fuse_bufvec::buf</a></div><div class="ttdeci">struct fuse_buf buf[1]</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00726">fuse_common.h:726</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-3_88_80_2include_2fuse__opt_8h_source.html#l00109">fuse_opt.h:109</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_ad119a72f00b4cd2e4a500fd3364ae1e2"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00046">fuse_lowlevel.h:46</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a399a43ff69a20ce42082a81eb1517992"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a399a43ff69a20ce42082a81eb1517992">fuse_lowlevel_notify_delete</a></div><div class="ttdeci">int fuse_lowlevel_notify_delete(struct fuse_session *se, fuse_ino_t parent, fuse_ino_t child, const char *name, size_t namelen)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02265">fuse_lowlevel.c:2265</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a5b3ef5b12be33295311d6b751846c263"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a5b3ef5b12be33295311d6b751846c263">FUSE_CAP_POSIX_ACL</a></div><div class="ttdeci">#define FUSE_CAP_POSIX_ACL</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00338">fuse_common.h:338</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-3_88_80_2include_2fuse__common_8h_source.html#l00670">fuse_common.h:670</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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00100">fuse_lowlevel.h:100</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a990af0becaba1b5e45781d399720f85e"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02690">fuse_lowlevel.c:2690</a></div></div>
<div class="ttc" id="structfuse__buf_html_a62b2ae82904ac4355142984b9dd90d68"><div class="ttname"><a href="structfuse__buf.html#a62b2ae82904ac4355142984b9dd90d68">fuse_buf::fd</a></div><div class="ttdeci">int fd</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00689">fuse_common.h:689</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_aec0ad71a3e8c357ebe7e87cdecbdbe18adcef8052c48f314d4d9f9f05a5b4f838"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#aec0ad71a3e8c357ebe7e87cdecbdbe18adcef8052c48f314d4d9f9f05a5b4f838">FUSE_BUF_NO_SPLICE</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00631">fuse_common.h:631</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-3_88_80_2include_2fuse__lowlevel_8h_source.html#l00094">fuse_lowlevel.h:94</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__opt_8h_html_a21602e6a0fff64fc9c7b642d12382094"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__opt_8c_source.html#l00055">fuse_opt.c:55</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a2568c799f5f90ad2f0c353d48d8b8780"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a2568c799f5f90ad2f0c353d48d8b8780">FUSE_CAP_AUTO_INVAL_DATA</a></div><div class="ttdeci">#define FUSE_CAP_AUTO_INVAL_DATA</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00240">fuse_common.h:240</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__common_8h_html_a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__common_8h.html#a5e36b839c4dbf0439bd85b61c7213a58affd5b3b7e9cdd5f89b3126eea96e033b">FUSE_BUF_IS_FD</a></div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__common_8h_source.html#l00597">fuse_common.h:597</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-3_88_80_2include_2fuse__common_8h_source.html#l00666">fuse_common.h:666</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__log_8h_html_a4506ffd6ed3a631e01999b32b1eb8621"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__log_8h.html#a4506ffd6ed3a631e01999b32b1eb8621">fuse_log</a></div><div class="ttdeci">void fuse_log(enum fuse_log_level level, const char *fmt,...)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2lib_2fuse__log_8c_source.html#l00033">fuse_log.c:33</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a52674fc627647f33e63c74267f0f1f9d"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l02439">fuse_lowlevel.c:2439</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a170f8c6b953d70928e83bcecee43bfdc"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00453">fuse_lowlevel.c:453</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a198429f3fbc23ef29ef9971271827690"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l03115">fuse_lowlevel.c:3115</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a65431e8196e0533257acad767f7b074f"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00915">fuse_lowlevel.c:915</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a34f3f1beebacab5f717d95baf832a8a5"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00357">fuse_lowlevel.c:357</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a5a5872d7f73f0bd593e00788a4c7bbb7"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l00448">fuse_lowlevel.c:448</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a2172d260d34c76c25cd601870aee4220"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__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-3_88_80_2lib_2fuse__lowlevel_8c_source.html#l01058">fuse_lowlevel.c:1058</a></div></div>
<div class="ttc" id="fuse-3_88_80_2include_2fuse__lowlevel_8h_html_a1fe719ed24a713bb5d17e4e7a0dde730"><div class="ttname"><a href="fuse-3_88_80_2include_2fuse__lowlevel_8h.html#a1fe719ed24a713bb5d17e4e7a0dde730">fuse_interrupt_func_t</a></div><div class="ttdeci">void(* fuse_interrupt_func_t)(fuse_req_t req, void *data)</div><div class="ttdef"><b>Definition:</b> <a href="fuse-3_88_80_2include_2fuse__lowlevel_8h_source.html#l01815">fuse_lowlevel.h:1815</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>
|